LINUX.ORG.RU

gcc bug (global array of templated class - no destructors)


0

0

Коллеги!

Будьте добры,
скомпилируйте пример
своей версией gcc
и расскажите о наличии
или отсутствии проблемы
(т.е. есть ли две строки
"Main globaler destructor")

Более подробно на
http://www.rsdn.ru/Forum/Message.aspx?mid=1487421


#include <iostream>

template <class T>
class MainGlobaler
{
public:
MainGlobaler(char *) {std::cout << "Main globaler constructor" << std::endl;}
virtual ~MainGlobaler() {std::cout << "Main globaler destructor" << std::endl;}
};

static MainGlobaler<std::string> MgArr[] =
{
MainGlobaler<std::string>("Klava"), MainGlobaler<std::string>("Slava")
};

int main(int argc, char **argv)
{
std::cout << "Top of main" << std::endl;
}
anonymous

> (т.е. есть ли две строки
> "Main globaler destructor")

Debian unstable

g++-4.0 - есть
g++-3.4 - нет

Бага, однозначно.

int19h ★★★★
()
Ответ на: комментарий от int19h

Мне не кажется очевидным, что при выходе из программы (например, окончанием main) для статических объектов должны вызываться деструкторы. Это описано в стандарте?

erDiZz
()
Ответ на: комментарий от Reset

> 3.4.4 есть

Правильно ли я понимаю, что имеется ввиду наличие строчек, т.е. отсутствие бага?

anonymous
()

Деструктор НЕ вызывается:

(привожу отклик на gcc --version):

gcc (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-34)

gcc (GCC) 3.2

gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux)

gcc (GCC) 3.3.1 (SuSE Linux)

Деструктор вызвался icc:

$icc --version 8.0

Попробовал на Альфе компаковским cxx -- не откомпилился, т.к. не нашел std::string. Тогда я поменял string на int, и деструктор вызвался,

$cxx -V Compaq C++ V6.3-005 for Digital UNIX V4.0F (Rev. 1229)

(вышеперечисленные gcc деструктор и с <int> тоже НЕ вызывали).

То есть, данная фича, похоже, баг, присущий gcc 3.x

Die-Hard ★★★★★
()
Ответ на: комментарий от aton

aton:

> лечить так:

> static MainGlobaler<std::string> MgArr[2] = ..

Фантастика!

Так, действительно, везде все вызывается!

Die-Hard ★★★★★
()
Ответ на: комментарий от Reset

$ g++ -v
...
gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)

$ ./a.exe
Main globaler constructor
Main globaler constructor
Top of main
Main globaler destructor
Main globaler destructor

Reset ★★★★★
()

деструкторы вызываться обязаны при любом раскладе, т.к. у них есть side effects.

такое ощущение, что у gcc проблема с implicit template instaniation, либо он считает MgArr[] - массивом неизвестной длины и следовательно incomplete type(собсна это объясняет почему при указании размера явно все нормально). причем массиву не обязательно быть static, если это дело убрать, то dtor тоже не вызывается :)

но если явно сделать instaniation деструктора, то вызывается все.

template MainGlobaler<std::string>::~MainGlobaler() // если вот это написать, то деструкторы вызываются, это про gcc (GCC) 3.3.3 (SuSE Linux 9.1)

остальное: 4.0.2 SuSE Linux 10.0 - нормально все. icc 8.1 Linux - нормально

AnToXa
()
Ответ на: комментарий от Die-Hard

> данная фича, похоже, баг, присущий gcc 3.x

Не совсем. Все страньше.

Например, у такой версии все плохо gcc version 3.4.5 20050920 (prerelease) [FreeBSD]

а у такой все хорошо gcc version 3.4.2 (mingw-special)

anonymous
()

Вообще, глюки в g++ - это, похоже, норма жизни. Попробуйте вот в 4.0 на
досуге:

#include <iostream>
#include <locale>

int main()
{
std::wcout::imbue(std::locale());
return 0;
}

int19h ★★★★
()
Ответ на: комментарий от int19h

>Попробуйте вот в 4.0 на досуге:

А что должно быть?

Ну не компилируется, вполне разумно сообщая, что std::wcout не является именем класса. Если вторую пару двоеточий заменить на всего лишь одну точку, то соберется.

Ну а глюки - вообще норма жизни. Причем не только в g++.

Тот баг, который был положен в основу этого thread, характерен (и интересен) тем, что не удается установить, в каких версиях компилятора он присутствует, а в каких нет. А понять мне это нужно для изготовления patch к 3.2.2.

anonymous
()
Ответ на: комментарий от anonymous

> Ну не компилируется, вполне разумно сообщая, что std::wcout не
> является именем класса. Если вторую пару двоеточий заменить на всего
> лишь одну точку, то соберется.

Да, это моя ошибка. Потому как не copy-paste, а настучал по памяти.

А вот теперь ты запустить попробуй. И полюбуйся на segfault.

int19h ★★★★
()
Ответ на: комментарий от int19h

/tmp >cat loctst.cpp
#include <iostream>
#include <locale>

int main()
{
std::wcout.imbue(std::locale());
return 0;
}
/tmp >make loctst
g++     loctst.cpp   -o loctst
/tmp >g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
Thread model: posix
gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)
/tmp >./loctst && echo "exit Ok"
exit Ok
/tmp >ldd ./loctst
        linux-gate.so.1 =>  (0x007e1000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00c32000)
        libm.so.6 => /lib/libm.so.6 (0x002af000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bff000)
        libc.so.6 => /lib/libc.so.6 (0x00183000)
        /lib/ld-linux.so.2 (0x00165000)

anonymous
()
Ответ на: комментарий от int19h

> А вот теперь ты запустить попробуй. И полюбуйся на segfault.

Какой-такой segfault ?

$ cat lll.cpp
#include <iostream>
#include <locale>

int main()
{
std::wcout.imbue(std::locale());
return 0;
}
$ g++ -std=c++98 lll.cpp -o lll
$ ./lll
$ echo $?
0
$ g++ -v
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.4/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.4 (pre 3.3.5 20040809)
$




Onanim
()
Ответ на: комментарий от Onanim

> Какой-такой segfault ?

В 3.4.x его и нет. А вот в моем g++-4 - есть. В редхате, судя по посту
выше, и четверку уже пропатчили. Ждем в Debian unstable...

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.