https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html瞭解GCC 5的_GLIBCXX_USE_CXX11_ABI或新ABI
我遇到了崩潰/ Valgrind的問題與使用上GCC 5的std :: string上面的鏈接提示,有在ABI開始GCC 5.x的變化。 libstd ++的新默認ABI是C++ 11/14 ...,它與舊的ABI不兼容。有一種方法可以使用定義來選擇較早的ABI。
我想了解ABI之間有什麼區別,還沒有找到細節。我想幫助理解:
- std :: string需要解決什麼樣的問題才能與新的ABI兼容?它們是否與寫入相關?
- 這些變化會影響較早的ABI嗎?
- 讓_GLIBCXX_USE_CXX11_ABI工作的任何提示?
關於我遇到的問題的更多細節(https://github.com/YasserAsmi/jvar/issues/21)該項目在GCC 4.8和Clang中運行良好。與海灣合作委員會,同樣的代碼拒絕運行:
x_misc(33112,0x7fff728c2000) malloc: *** error for object 0x7fd639c034cc: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
這裏是一個局部Valgrind的輸出:
==33027== Invalid read of size 1
==33027== at 0x1006F78BA: _platform_memmove$VARIANT$Nehalem (in /usr/lib/system/libsystem_platform.dylib)
==33027== by 0x100009388: jvar::Variant::toString[abi:cxx11]() const (in bin/ex_misc)
==33027== by 0x1000023A7: bugreport() (in bin/ex_misc)
==33027== by 0x1000133B8: main (in bin/ex_misc)
該項目採用的std :: string,並有一些自定義的內存管理。它正在做一些非典型但有效的操作,使用放置新的構造函數等。我試圖更好地理解API會影響什麼樣的代碼,以及如何修復它 - 一個開始的地方。
如果您一致地編譯所有對象(使用相同的ABI),那麼您得到的錯誤是由於程序中的錯誤或(更不可能)是新ABI實現中的實際錯誤。在任何一種情況下,都可以將其用於一個小型測試用例併發布到此處([MCVE])。 – davmac