2012-06-22 31 views
0

我已經嘗試了一千次以找到該死的內存泄漏在這個片段,但我只是悲慘地失敗......我正在學習內存分配和這些東西,我是從來沒有能夠做一個程序,將完全釋放它的內存呢......C++應用程序中的內存泄漏

我打電話給for循環來分配140 Contato_s結構,並把它們放到議程std :: list。然後我打電話給另一個for循環刪除使用RemoverContato和相應代碼的所有140個聯繫人... Windows不報告free'd內存的單個Kb!

​​

在此先感謝:)!

- 編輯

好了,這就是我如何試圖破壞聯繫人:

for(int i=0; i<140; ++i) 
    { 
     if(RemoverContato(1+i) == 0) 
      std::cout << "Fail removing contact " << i << std::endl; 
     else 
      std::cout << "Contact " << i << " removed" << std::endl; 
    } 

(OFC我總是得到「跟X刪除」,而不是失敗的那一部分,所以聯繫正在被發現,理論上)

+3

那麼,你是否爲列表中的每個元素調用'RemoverContato'?如果你不顯示你如何調用這個代碼,那麼我們可以告訴你的不多(除了'std :: list '而不是'std :: list ''是不必要的邊界愚蠢的)。 – ildjarn

+0

你需要展示你如何調用'RemoverContato'。 9 – Marlon

+1

你所說的一切都表明內存泄露了。物理內存由操作系統管理,並且在其他地方需要時可隨時重新使用。虛擬內存是每個進程的,所以不能被「返回」。我認爲錯誤只是在你的期望 - 期待一個進程將虛擬內存返回到系統(這是沒有意義的,因爲虛擬內存是每個進程)。 –

回答

0

你需要確保每個Contato_s有一個獨特的Codigo(這是否意味着ID?我將它稱爲一個ID)。有可能多個Contato_s可以共享相同的ID,因爲您將ID設置爲Agenda的當前大小(例如,您添加了兩個聯繫人,刪除了第一個聯繫人,然後再添加了另一個聯繫人......這兩個聯繫人將具有相同的ID ID爲2)。您的移除技巧將只移除第一個匹配的ID,讓其他人保留。在返回成功或失敗之前,您應該查看所有聯繫人並檢查所有ID,然後RemoverContato

+0

謝謝,但我只查了一下,所有的ID都是獨一無二的,但是當創建和刪除多次時,這會搞砸,所以謝謝,現在基於Codigo的創作真的是獨一無二的,但即便如此,泄漏仍然存在。 –

+0

你是如何確定內存泄漏的? –

+0

在任務管理器*和* sysinternals VMMAP中使用了一些觀察,我還在vmmap中使用了字符串計數器,並且在重複調用create-destroy時報告字符串的數量不斷增加 –