Archives
D Programming
DD.gnu digitalmars.D digitalmars.D.bugs digitalmars.D.dtl digitalmars.D.dwt digitalmars.D.announce digitalmars.D.learn digitalmars.D.debugger C/C++ Programming
c++c++.announce c++.atl c++.beta c++.chat c++.command-line c++.dos c++.dos.16-bits c++.dos.32-bits c++.idde c++.mfc c++.rtl c++.stl c++.stl.hp c++.stl.port c++.stl.sgi c++.stlsoft c++.windows c++.windows.16-bits c++.windows.32-bits c++.wxwindows digitalmars.empire digitalmars.DMDScript |
c++ - bad code generated when deleting object
I finally tracked down the crash in omniidl (I reported earlier) to this code generation problem: #include <stdio.h> void operator delete(void *x) { printf("delete(%08x)\n", x); } struct A { A() { printf("A::A() this=%08x\n", this); parent = instance; instance = this; } ~A() { printf("A::~A() this=%08x\n", this); instance = parent; } static void destroy() { delete instance; } private: A *parent; static A *instance; }; A *A::instance = 0; int main() { A *a1 = new A; A *a2 = new A; A::destroy(); A::destroy(); return 0; } When compiled with DM ("dmc test.cpp" or "dmc -o+all test.cpp") I get the following output: A::A() this=40ab1a5c A::A() this=40ab1a68 A::~A() this=40ab1a68 delete(40ab1a5c) A::~A() this=40ab1a5c delete(00000000) The interesting part is that the wrong memory block is freed (the destructor is called for 40ab1a68, but the object at 40ab1a5c is freed - Digital Mars assumes that the destructor for A doesn't change A::instance...). bye, Christof -- http://cmeerw.org JID: cmeerw jabber.at mailto cmeerw at web.de ...and what have you contributed to the Net? Dec 13 2002
|