2009-05-22 69 views
5

我在一個類中有一個靜態的std::vector。當我使用微軟的內存泄漏檢測工具:內存泄漏(有點)與靜態std :: vector

_CrtMemState state; 
_CrtMemCheckpoint(& state); 
_CrtMemDumpAllObjectsSince(& state); 

它報告後,我的東西插入到載體泄漏。這對我來說很有意義,因爲在向量中插入某些內容時會分配新空間。這個空間不會被釋放,直到程序終止(因爲矢量是靜態的)。這是正確的嗎?

在包含向量的類的析構函數中,我刪除了放入向量中的對象。但是,發生插入時分配的內存仍然懸而未決。無論如何刪除這個空間?

+0

可以顯示將代碼插入到向量中的代碼以及您引用的代碼,該代碼將刪除放入向量中的對象? – 2009-05-22 15:07:39

+0

我可以,如果你有興趣,但詹姆斯和ilproxyil幫我解決了這個問題。如果您有興趣,請告訴我。 – Joe 2009-05-22 15:14:01

回答

16

您可以將矢量與一個空的交換 - 這將釋放內存。

又見Q: Shrinking a vector

+1

太棒了!這工作。謝謝。我希望我早些時候提出過這個問題,而不是讓我的頭撞牆幾天。 :-) – Joe 2009-05-22 15:09:48

+0

這個答案是錯誤的:[交換技巧只有_may_釋放內存](http://stackoverflow.com/q/7829018/560648)。 – 2014-10-30 19:55:53

8

要添加到什麼詹姆斯寫道。他的意思是這樣做:

std::vector<T>().swap(v); 

其中'v'是你想要釋放的內存的向量。

0

這只是Visual Studio的一個怪癖。向量析構函數確實釋放內存,但內存檢查模塊並不總是發現它,所以它抱怨。這有點痛苦,但沒有什麼可擔心的。