The codes below basically builds a binary tree. It runs well on Intel
compiler. However, when I use gcc 4.2.0, the assignment to b[i].right
causes segmentation fault. Tracing with valgrind reveals that the
particular memory address was deleted during push_back().

If I change the assignments to

            int x = build_recursive(n-1);
            int y = build_recursive(n-1);
            b[i].left = x;
            b[i].right = y;

there is no segmentation fault anymore. It seems to me the original
code has the b[i] value cached, hence, during the assignment to
b[i].right, it uses old b[i] which may be invalidated after
push_back() due to resize.

Any ideas? Compiler problems? or non-trivial bugs? Thanks.

#include <vector>
using std::vector;

class A {
public:
    int left;
    int right;

};

class B {
public:
    void build(int n) {
        b.clear();
        next_index = 0;
        int root = build_recursive(n);
    }

    int build_recursive(int n) {
        int i = get_next_index();
        if (n > 0) {
            b[i].left = build_recursive(n-1);
            b[i].right = build_recursive(n-1);
        }
        return i;
    }

    int get_next_index(void) {
        A a;
        b.push_back(a);
        int index = next_index++;
        return index;
    }

    int next_index;
    vector<A> b;

};

int main(int argc, char* argv[])
{
    B tree;
    tree.build(14);
    return 0 ;
}


-- 
           Summary: vector push_back()/resize() causes assignment to deleted
                    memory
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: cshinyee at gmail dot com
  GCC host triplet: Linux
GCC target triplet: x86_64


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32068

Reply via email to