2011-09-29 54 views
2

我有一個向量,如下所示。釋放std :: vector的內存C++

std::vector<std::string> exportNameList; 

我正在使用push_back方法爲此添加元素。但是,我得到一個調試斷言爲「

」 Windows已經引發了AxCent.exe.This斷點可能是由於堆的腐敗,這表明在AxCent.exe或任何的DLL中的錯誤它已經加載。

這發生在它調用類的析構函數時。當我引用調用堆棧時,我被引導到vector類中的以下代碼塊。

~vector() 
{ // destroy the object 
    _Tidy(); 
} 

我注意到刪除矢量時出現錯誤。我對麼?我該如何解決?我已經提到了很多例子,但是還沒有設法解決這個問題。我對C++很陌生。

非常感謝。

+0

你能展示你的矢量的真實聲明嗎?你在裏面存儲什麼類型的對象? – Nikko

+0

嗨。你的問題究竟是什麼?當'exportNameList'超出範圍時,向量內存將被釋放。對於它所依賴的元素。 – esskar

+0

,並顯示您的代碼爲具有此成員的類的析構函數。 – Mat

回答

5

你大概會損壞矢量在別處使用的內存。

+0

你能否給我任何線索?我只在調試模式下收到此錯誤。謝謝。 – gishara

+0

你應該重新檢查你的應用程序的相關部分(開始的一個好點將是訪問所述矢量或其元素的所有地方)。如果可能,請嘗試減小程序的大小,直到找到錯誤。恐怕我們無法幫助你。 –

+0

@gishu如果你不知道如何在你的程序的其他地方損壞矢量,想象一下:你有一個指向錯誤位置的指針(偶然地,這恰好是矢量)。你寫信給它,矢量變壞了。更可能的情況是這樣的:在矢量旁邊的堆棧中有一個數組。您將數組的索引寫入數組的邊界之外,然後檢查矢量數據並將其破壞。 – Shahbaz

1

您遇到的錯誤可能與您的向量不直接相關。 如果在調用vector的析構函數之前內存(堆)已損壞,那麼堆管理器可能只會在此時檢測到損壞(釋放由向量動態分配的結構或內部動態分配的字符串)。

在我看來,在Windows平臺上處理這類錯誤的最好方法是爲您的程序激活整頁堆。

您可以通過兩種方式做到這一點:

  • 或者使用包含在「Windows調試工具」 GFLAGS。運行它作爲管理員,轉到'圖像文件'選項卡,在圖像字段(AxCent.exe)中輸入您的EXE的名稱,按TAB並選中'啓用頁堆',然後按'應用'
  • 或使用應用程序驗證。通過文件/應用程序應用程序菜單選擇您的可執行文件進行勾選'基本/堆'選中並點擊保存。

無論何時啓動此應用程序,都會應用此設置。

然後在調試器(WindDbg或Visual Studio)下運行您的應用程序。如果在刪除向量之前內存已損壞,則調試器應該在此處中斷。

當您完成跟蹤錯誤時,請不要忘記關閉整頁堆。

+0

非常感謝Thierry。我不會嘗試使用'Windows調試工具',但發現它非常複雜。無論如何,我會再試一次。再次感謝。 – gishara

+0

「Windows調試工具」(WinDbg,kd,cdb)中包含的調試器首先可能會嚇到你。我可以理解,但知道這些工具是非常有價值的。包含在同一個軟件包中的gflags只是配置註冊表的一個小界面,以便Windows將一些策略應用於您的應用程序。它非常易於使用,對於您遇到的特定問題,Visual Studio應該足以查明您的問題。 –