std :: stack портит возвращаемое значение - PullRequest
4 голосов
/ 01 ноября 2010

Я сократил свой код до следующего, чтобы проиллюстрировать мою проблему:

#include <iostream>
#include <stack>
#include <utility>

std::pair<double,double> test(double a, double b)
{
    std::stack<int> my_stack;
    return std::make_pair<double,double>(a,b);
}

int main()
{
    std::pair<double,double> p = test(1.1,2.2);
    std::cout << p.first << " " << p.second << "\n";

    return 0;
}

Возвращаемое значение из функции test () повреждается при использовании флага gcc -O1.Вот пример выходных данных:

$ gcc -O2 a.cxx  -lstdc++
$ ./a.out
1.1 2.2
$ gcc -O1 a.cxx  -lstdc++
$ ./a.out
2.60831e-317 2.60657e-317
$ gcc -v
Reading specs from /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.3/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/lib64 --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib64 --with-system-zlib --enable-shared --enable-__cxa_atexit x86_64-suse-linux Thread model: posix
gcc version 3.3.3 (SuSE Linux)

Этот код работает со всеми флагами оптимизации gcc, кроме "-O1".Это также работает, если я удаляю объявление my_stack.Вы бы классифицировали это как ошибку компилятора, или я что-то упустил в std :: stack и возвращал значения std :: pair?

Ответы [ 2 ]

10 голосов
/ 01 ноября 2010

Определенно ошибка компилятора. Кстати, это не воспроизводится с моей версией GCC (4.4.5).

Известно, что версия GCC 3.3.3, поставляемая с SuSE 9.1, не работает (см. здесь ).

2 голосов
/ 01 ноября 2010

Это ошибка.Проверьте, было ли сообщено об ошибке, если нет, сообщите об этом.

...