2010-08-19 63 views
0

我有一個使用動態加載庫的大應用程序。在程序結束時終止它或者segfaults或者吐出一條消息「glibc檢測到損壞的雙鏈表」。望着Valgrind的輸出,我認爲是這樣的話是什麼: 讓我們說我們有三個文件:gcc,C++:static string member variarible導致堆損壞/分段錯誤

utilities.c  - compiled with -fPIC and used ar and ranlib to create utilities.a. 
dynamicallyloaded.c- compiled with -fPIC and -shared and linked with utlities.a to generate dynamicallyloaded.so 
main.c    - compiled with -fPIC and linked with utilities.a to create main. main dynamically loads and uses dynamicallyloaded.so . 
utilities.h  - delclared a class IfTrackerFile with AubFileName as a static string member like static string   AubFileName; 

utilities.cpp  - defines the static variable: string IfTrackerFile::AubFileName; 

的valgrind出來說有是無效的自由/刪除/刪除就行了: 串IfTrackerFile :: AubFileName;

我不知道發生了什麼事。 真正感謝在這方面的任何幫助/方向。

+0

使用靜態庫不是微不足道的。將所有內容編譯爲共享庫,並讓編譯器將其整理出來。 – 2010-08-19 15:32:17

回答

0

這是在黑暗中拍攝的照片,但問題可能是全局對象。將類實例化爲全局變量意味着該變量在調用main()之前被實例化。這意味着構造函數在main()開始之前被調用並且在main完成之後調用析構函數。構造函數和析構函數被調用的順序也是不確定的。

我的建議是將所有全局對象(全局變量不是普通的舊數據 - POD類型)轉換爲在main的開始處實例化並在main的末尾銷燬的指針。

1

我的猜測是你最終得到了IfTrackerFile::AubFileName的兩個不同副本。一個是從utilities.a直接在程序中拉動它,另一個是動態加載dynamicallyloaded.so。我猜測,這使得系統在程序關閉時將所有靜態和全局對象破壞,並最終調用析構函數兩次。

我不認爲你應該以這種方式混合.a和.so文件。基本上,一個好的經驗法則是永遠不要鏈接.so文件與.a,即使您將-fPIC代碼放在.a中。