簡體   English   中英

的std ::矢量 <std::string> 緊急

[英]std::vector<std::string> crash

這個問題是我的問題的延續。

這是有問題的代碼。

啊:

#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)

您的問題是將-D_GLIBCXX_DEBUG傳遞給a.cpp 此標志向STL結構添加其他調試信息,因此其使用必須在項目中的所有文件中保持一致。 否則,不同的文件不同意std::vectorstd::string的內存布局,導致未定義的行為(在您的情況下崩潰)。

在上一個問題中,您可以在此處參考GCC文檔: http//gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt03ch17s04.html 該文檔聲明GCC libstdc ++“支持按用戶重新編譯”,並將其定義如下:

每次使用重新編譯:用戶必須重新編譯他或她的應用程序的部分以及它依賴於調試應該發生的位置的C ++庫,以及與這些容器交互的任何其他代碼。 這意味着訪問特定標准容器實例的一組轉換單元可以在發布模式(無檢查)或調試模式(完全檢查)中編譯,但必須以相同的方式編譯; 沒有看到標准容器實例的翻譯單元不需要重新編譯。 這也意味着包含在發布模式下編譯的特定實例化(例如,std :: vector)的轉換單元A可以鏈接到包含在調試模式下編譯的相同實例化的轉換單元B(部分重新編譯時不存在的特性) )。 雖然這種行為在技術上違反了單一定義規則,但這種能力在實踐中往往非常重要。 libstdc ++調試模式支持這種級別的重新編譯。

對於每個單元的編譯,這是你在這里嘗試做的,它說:

我們認為,如果我們打算提供安全的迭代器,保持程序語義不變,並且在發布模式下不會降低性能,那么這種重新編譯水平實際上是不可能的....

因此,我對你上一個問題的回答並不完全准確,我道歉。 我已經添加了一個附錄來糾正它,我希望這是一個有用的建議,如何解決那里的多庫問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM