这个问题是我之前提出的一个问题的延续,详见我的问题。
下面是有问题的代码。
a.h:
以下是编译过程(main.cpp 使用 STL 调试标志进行编译):
运行 a.out 时,进程崩溃:
我的GCC:
下面是有问题的代码。
a.h:
#include <string>
#include <vector>
std::vector<std::string> foo();
a.cpp
#include "a.h"
std::vector<std::string> foo()
{
std::vector<std::string> v;
return v;
}
最后是main.cpp文件:
#include "a.h"
#include <iostream>
int main()
{
std::vector<std::string> s = foo();
return 0;
}
以下是编译过程(main.cpp 使用 STL 调试标志进行编译):
g++ -c a.cpp
g++ -D_GLIBCXX_DEBUG main.cpp a.o
运行 a.out 时,进程崩溃:
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x00007fe355998c43 in __gnu_debug::_Safe_iterator_base::_M_detach_single() () from /usr/lib64/libstdc++.so.6
(gdb) bt
#0 0x00007fe355998c43 in __gnu_debug::_Safe_iterator_base::_M_detach_single() () from /usr/lib64/libstdc++.so.6
#1 0x00007fe355999ebc in __gnu_debug::_Safe_sequence_base::_M_detach_all() () from /usr/lib64/libstdc++.so.6
#2 0x0000000000400cac in __gnu_debug::_Safe_sequence_base::~_Safe_sequence_base() ()
#3 0x0000000000400cc6 in __gnu_debug::_Safe_sequence<std::__debug::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::~_Safe_sequence() ()
#4 0x0000000000400ce7 in std::__debug::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~vector() ()
#5 0x0000000000400c35 in main ()
我的GCC:
Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux
Thread model: posix
gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)
string
和vector
的 G++ 实现不够熟悉,无法确切地评论其表示方式的变化;但是,你的实验表明了它确实存在。话虽如此,我对你链接的 G++ 文档的解读表明,尽管std::string
可以在调试和发布模式之间安全地传递,但std::vector
没有这样的保证。 - bdonlan