2016-02-28 48 views
2

我創建一個object_ptr並將其插入stl映射中。然後在代碼的其他部分,我使用鍵找到對象,並從地圖中刪除值並刪除對象。似乎代碼有內存泄漏。我怎樣才能避免它?從地圖中刪除對象指針時避免內存泄漏。

這裏是代碼片段:

void foo(){ 
    Request * req = new Request(); 
    MyMap.insert (std::pair<int, Request *> (address, req)); 
    bar(address); 
} 
void bar(int address){ 
    map<int, Request*>::iterator it_req = MyMap.find(address); 
    MyMap.erase(it_req); 
    delete it_req->second; 

} 
+3

通過不使用原始指針作爲'mapped_type'。 – LogicStuff

+0

交換'delete'和'erase'行。 –

回答

5

的問題是在這裏:

MyMap.erase(it_req); 
delete it_req->second; 

一旦你有erase d的元素,迭代器不再有效。您無法取消引用它以獲取指向delete的指針。最簡單的解決方案就是將這兩條線顛倒過來:delete然後erase

但是,更好的方法是根本不需要delete。你真的需要動態分配Request嗎?你可以直接將它存儲在map

std::map<int, Request> myMap; 

然後你根本不用擔心。只要做myMap.erase(it_req);;沒有delete擔心。這實際上是最簡單的解決方案,就邏輯思考和代碼量而言(但對於現有代碼可能會略微更大一些)。

如果你真的需要動態分配Request,不管是什麼原因,而不是存儲一個原始指針,你可以存儲一個智能指針,當指針被銷​​毀時它會自動被指針對象delete。默認的選擇是std::unique_ptr

std::map<int, std::unique_ptr<Request>> myMap; 

然後你再次只需要做myMap.erase(it_req);;沒有人工delete擔心。

+0

替換擦除和刪除命令的順序,並沒有幫助。我仍然有泄漏問題。我會嘗試下一個解決方案。 – Nargesoo

+0

那麼'erase()'/'delete'是你顯示的會導致泄漏的小代碼中唯一的問題。也許你看到的具體問題實際上是在其他地方。也許你需要一個新的問題,使用[MCVE](http://stackoverflow.com/help/mcve),以便我們可以追蹤到實際問題。如果問題在別處,代碼片段是不夠的。 – BoBTFish