簡體   English   中英

處理內存時,使用std :: vector

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM