The following program generates segmentation fault when exception is thrown from
constructor. The fault happens if type of CONTAINER is std::list or std::set,
but does not happen if its type is std::vector or if CONTAINER is ommited from
TST class. Also tested on linux with same resutls.
Program source:-
#include
class TST {
std::list CONTAINER;
public:
TST(int i) {
if (i==0) {
delete this;
throw 1;
}
}
~TST() {
printf("Destructor\n");
}
};
int main() {
TST* tst = NULL;
try {
tst = new TST(0);
}
catch (int i) {
printf("Caught %d\n",i);
}
if (tst != NULL)
delete tst;
}
---
Compile command output:
---
$ g++ -v -save-temps tst.cpp
Reading specs from C:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as
--host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls
--enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry
--disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt
--without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter
--enable-hash-synchronization
Thread model: win32
gcc version 3.3.3 (mingw special)
C:\MinGW\bin\..\lib\gcc-lib\mingw32\3.3.3\cc1plus.exe -E -D__GNUG__=3 -quiet -v
-iprefix C:\MinGW\bin\../lib/gcc-lib/mingw32/3.3.3/ -D__GNUC__=3
-D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=3 tst.cpp tst.ii
ignoring nonexistent directory "C:/MinGW/mingw32/include"
ignoring nonexistent directory "/mingw/mingw32/include"
#include "..." search starts here:
#include <...> search starts here:
C:/MinGW/include/c++/3.3.3
C:/MinGW/include/c++/3.3.3/mingw32
C:/MinGW/include/c++/3.3.3/backward
C:/MinGW/include
C:/MinGW/lib/gcc-lib/mingw32/3.3.3/include
/mingw/include/c++/3.3.3
/mingw/include/c++/3.3.3/mingw32
/mingw/include/c++/3.3.3/backward
/mingw/include
/mingw/include
/mingw/lib/gcc-lib/mingw32/3.3.3/include
/mingw/include
End of search list.
C:\MinGW\bin\..\lib\gcc-lib\mingw32\3.3.3\cc1plus.exe -fpreprocessed tst.ii
-quiet -dumpbase tst.cpp -auxbase tst -version -o tst.s
GNU C++ version 3.3.3 (mingw special) (mingw32)
compiled by GNU C version 3.3.3 (mingw special).
GGC heuristics: --param ggc-min-expand=60 --param ggc-min-heapsize=57214
C:\MinGW\bin\..\lib\gcc-lib\mingw32\3.3.3\..\..\..\..\mingw32\bin\as.exe
--traditional-format -o tst.o tst.s
C:\MinGW\bin\..\lib\gcc-lib\mingw32\3.3.3\..\..\..\..\mingw32\bin\ld.exe
-Bdynamic /mingw/lib/crt2.o C:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3/crtbegin.o
-LC:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3 -LC:/MinGW/bin/../lib/gcc-lib
-L/mingw/lib/gcc-lib/mingw32/3.3.3
-LC:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3/../../../../mingw32/lib
-L/mingw/lib/gcc-lib/mingw32/3.3.3/../../../../mingw32/lib -L/mingw/lib
-LC:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3/../../..
-L/mingw/lib/gcc-lib/mingw32/3.3.3/../../.. tst.o -lstdc++ -lmingw32 -lgcc
-lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32
-lgcc -lmoldname -lmingwex -lmsvcrt
C:/MinGW/bin/../lib/gcc-lib/mingw32/3.3.3/crtend.o
--
Summary: Segmentation fault after exception in list and set
destructors
Product: gcc
Version: 3.3.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: libstdc++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: vldmrrr at yahoo dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: mingw32
GCC host triplet: mingw32
GCC target triplet: mingw32
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20579