2011-03-03 44 views
10

我正在處理一個非常棘手的問題,我現在已經堅持了一個星期。我打了一面非常堅硬的牆壁,額頭因撞擊而受傷,所以我希望有人能幫助我。由於源文件中存在未執行代碼而導致運行應用程序時發生崩潰 - C++

我正在使用Visual Studio 2005進行此項目 - 我已安裝2008,但在嘗試使用時遇到類似問題。

我們有一個應用程序目前正在對OpenCv1.1進行編譯,我試圖將它更新到2.2。當我們將靜態鏈接切換到新的庫時,應用程序崩潰 - 但僅在發佈模式下。所以動態鏈接和調試都可以正常工作。調用push_back

崩潰是std::vector

然後我想到了它運行的一些基本代碼在OpenCV中的正常工作,然後把該完全相同的代碼,並把它添加到我們的應用程序的樣本測試應用程序。該代碼失敗。

然後我去內臟的應用程序,它並沒有實例除了主界面和1類稱爲代碼的任何代碼的對象,它仍然墜毀。但是,如果我直接在主GUI中運行該代碼,則它工作正常。

我便開始註釋掉的應用程序的大量(在不應該被實例化的組件),並最終我的工作我的方式下來下來下來,直到......

我有了一個方法的類

void Foo() 
{ 
    std::vector<int> blah; 
    blah.begin(); 
} 

如果此方法是在報頭中定義,測試代碼的工作,但如果這個代碼在CPP文件中定義,它崩潰。另外,如果我使用std::vector<double>而不是int,它也可以。

然後我試着玩編譯器選項,如果我關閉了優化(/ Od)並將內聯函數擴展設置爲僅__inline(/ Ob1),即使代碼位於cpp文件中也可以工作。

當然,如果我們回到ungutted應用程序,並通過自己改變這些編譯器選項,它崩潰。

如果有人對此有任何見解,請告訴我。

謝謝, Liron

+0

當你使用調試器完成它時,程序能夠完全加載或在它到達main(或WinMain)之前崩潰嗎?你的問題很有趣,因爲通常我發現動態鏈接比靜態鏈接到運行時更有問題 – greatwolf 2011-03-03 00:53:16

+0

程序完全加載正常。然後我在(Qt)gui上按下一個按鈕,運行代碼調用opencv。如果代碼是正確的在按鈕按下它的作品,但如果代碼從另一個類中調用,它會崩潰。 – Liron 2011-03-03 01:17:30

+0

我更新了項目,根本不創建gui,一旦我調用opencv代碼,它仍然崩潰。 – Liron 2011-03-03 02:08:09

回答

8

哎呀!解決方案想通了。

在我們的解決方案中,我們定義了_SECURE_SCL = 0,但是在我們構建的第三方庫中,這是未定義的(意味着= 1)。假設將_SECURE_SCL設置爲0會大大減少運行時間,但它必須在所有包含的庫中執行相同的操作,否則它們會以不同的方式處理數組大小。

http://msdn.microsoft.com/en-us/library/aa985896%28v=vs.80%29.aspx

這是一個有趣的一週。

6

STL類,像載體<>具有釋放之間的佈局失配和調試生成,由迭代調試支持。您的問題的行爲完全像您在應用程序的發行版本中鏈接.lib或DLL的調試版本時所遇到的那種麻煩,並在它們之間交換STL對象。結果是堆損壞和訪問衝突異常。

三重檢查您的構建設置,並確保你永遠只能鏈接的.libs的發行版本在發佈版本,並在你的調試版本的.libs的調試版本。

+0

+1。只需添加一種可能性:將靜態鏈接的DLL/EXE與動態鏈接的動態鏈接混合,然後傳遞指針而不用攜帶信息如何正確銷燬。 – 0xC0000022L 2011-03-03 01:23:28

+0

我們應該動態地做所有事情。 – Liron 2011-03-03 02:04:03

+0

我們包含的庫包括: Imm32.lib QtCore.lib QtGui.lib QtMain.lib QtNetwork.lib QtOpenGL.lib QtXml.lib Vfw32.lib WinMM.lib comctl32.lib glu32.lib libjasper.lib libjpeg.lib libpng的.lib libtiff.lib opencv_calib3d220.lib opencv_contrib220.lib opencv_core220.lib opencv_features2d220.lib opencv_ffmpeg220.lib opencv_flann220.lib opencv_gpu220.lib opencv_haartraining_engine.lib opencv_highgui220.lib opencv_imgproc220.lib opencv_lapack.lib opencv_legacy220.lib opencv_ml220.lib opencv_objdetect220.lib opencv_video220.lib ws2_32.lib qjpeg.lib 此外,我們正在鏈接增強,它應該處理這個 – Liron 2011-03-03 02:04:30

0

可以嘗試:

void Foo() 
{ 
    std::vector<int> blah; 
    blah.reserve(5); 
    blah.begin(); 
} 
+0

添加儲備(5)沒有區別。仍然崩潰。無論如何,該函數中的代碼永遠不會執行(至少調試器不會觸發它)。 – Liron 2011-03-03 01:22:51

+0

@LKIM然後嘗試std :: vector blah(5); – fazo 2011-03-03 01:37:27

+0

我們曾經有過 - 仍然導致崩潰: - \。上面的代碼只是讓我可以把崩潰降低到我能做到的最小,但那曾經是做了很多功能的一部分。 – Liron 2011-03-03 03:49:44

相關問題