[英]Dealing with memory, when using std::vector
我正在使用帶有我自己類類型的vector:
std::vector<CItem> m_vItems;
在我的課程中,我正在初始化SFML類型,如紋理和精靈:
class CItem
{
(...)
sf::Texture m_Texture;
sf::Sprite m_Sprite;
sf::IntRect* m_pRect;
(...)
}
我正在嘗試將對象傳遞給我的向量聲明為其他類CLevel
成員,我正在這個類的方法中這樣做:
CItem *temp = new CItem(x, y, kind);
m_vItems.push_back(*temp);
如你所見,我不是用delete
temp
指針,但在類CLevel
析構函數中我有一個簡單的行:
std::vector<CItem>().swap(m_vItems);
我對內存泄漏感到困惑。 我的程序是否有一些這些或上面解決問題的行,我的例子已經正確編寫了?
您的程序調用new
而沒有匹配的delete
,並且它沒有將new
的結果傳遞給將為您管理它的其他類。 因此,您的程序有內存泄漏。
你有使用m_vItems.push_back(CItem(x, y, kind));
的問題m_vItems.push_back(CItem(x, y, kind));
而不是你提供的兩行示例?
CItem *temp = new CItem(x, y, kind);
m_vItems.push_back(*temp); // here a copy of *temp is pushed into vector
您應該在某處調用delete來刪除您使用temp分配的內容:
delete temp;
避免內存泄漏。 對new
任何調用必須具有匹配的調用以delete
某處。 這不會影響被推入矢量的臨時副本。 只要vector存在,它仍然存在。
最好只使用:
m_vItems.push_back(CItem(x, y, kind)); // implement this constructor correctly
// to avoid uninitialized variables
總是在涉及泄漏時,您可以使用工具來描述您的程序:Valgrind或Visual Leak Detector。
如果您使用的是Windows平台,則可以使用CRT庫來檢測特定代碼部分中是否存在任何泄漏。 此鏈接說明了如何在VS 2012中執行此操作,它也可用於早期版本。
假設您需要保留一個指針向量,而不是CItems的向量,我會使用智能指針來管理對象的生命周期。 shared_ptr易於使用:
shared_ptr<CItem*> temp(new CItem(x,y,z));
m_vItems.push_back(temp);
當向量移動時,CItem將被正確清理。 當項目傳遞時,它們也將被正確處理 - 沒有內存泄漏。
內存泄漏是指在堆上分配空間(在您的情況下通過調用new)並且對該內存的引用丟失。 換句話說,您無法通過調用delete來回收內存。 如果你使用swap將指針從一個向量移動到另一個向量,那么從技術上講,這不是泄漏,因為你仍然可以引用另一個向量中的內存,你仍然可以調用delete。
記得最后調用刪除。 在某些情況下可能很誘人,具體取決於使用方法,以便稍后讓系統清理,而不是刪除內存,例如,如果代碼是CGI。 但是,當代碼用於最初沒有預料到的用例時,例如從長時間運行的框架調用的單元測試時,這可能會導致問題。 通常值得花時間立即編寫刪除代碼,即使這樣做與即時目標沒有關系,也不要讓自己處於可能需要回圈並嘗試稍后修復它的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.