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++ - Crash in exception handler
Hello, this code below will crash after successfully catching the thrown Error. It will run ok if the "delete[] str" in the destructor or class Error is commented out. I compiled this example as dmc -Ae Ex.cpp - Heinz -------------- code start ------------------ #include <string.h> #include <stdio.h> class Error { public: Error(const char *m) { str = strcpy(new char[1+strlen(m)], m); } virtual ~Error() { delete[] str;} const char *msg() {return str;} protected: char *str; }; void Func() { try { throw Error("Test Error"); } catch(Error &e) { fprintf(stderr, "Error is %s\n", e.msg()); } }//Func int main() { Func(); return 0; } //main -------------- code end --------------------- Dec 20 2005
Hello, I have to blame myself a bit. I got a hint from PC-lint that Error did not have a copy constructor and assignment operator. First I added the assignment operator and the program still crashes. Then I also added the copy constructor and voila, program doesn't crash anymore! - Heinz Modified running code: -------------- code start ------------------ #include <string.h> #include <stdio.h> class Error { public: Error(const char *m) { str = strcpy(new char[1+strlen(m)], m); } Error(const Error &e) { str = strcpy(new char[1+strlen(e.str)], e.str); } virtual ~Error() { delete[] str;} Error &operator=(const Error &e) { delete[] str; str = strcpy(new char[1+strlen(e.str)], e.str); return *this; } const char *msg() {return str;} protected: char *str; }; void Func() { try { throw Error("Test Error"); } catch(Error &e) { fprintf(stderr, "Error is %s\n", e.msg()); } }//Func int main() { Func(); return 0; } //main -------------- code end -------------------- Dec 20 2005
|