This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/52339] New: using delete ptr1->ptr2 where ptr2 destructor deletes a const ptr1 fails


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

             Bug #: 52339
           Summary: using delete ptr1->ptr2 where ptr2 destructor deletes
                    a const ptr1 fails
    Classification: Unclassified
           Product: gcc
           Version: 4.6.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c++
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: rombust@hotmail.co.uk


The following code crashes and triggers the valgrind error with gcc 4.4 and
4.6. With clang it works just fine. And it also works fine if you remove
"const" on line 15 

*******
struct B;
struct A {
  B* b;
};

struct B {
  A* a;
  B() : a(new A{this}) {}
  ~B() { delete a; }
};

int main() {
  B* b = new B;
  // A* a = b->a;
  const A* a = b->a;
  delete a->b;
}
******

I have no idea if is it undefined behaviour to delete a->b if b deletes a.
Expressions should be evaluated only once, but for some reason this line:
  delete a->b;
is basically acting as if was written like:
  a->b->~B();
  operator delete(a->b); // a is already deleted


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]