2015-10-25 62 views
-1

我開始掌握指針並避免內存泄漏...如果存儲在指針圖中,是否需要刪除對象?

雖然我有一個問題...在我開始之前,我沒有使用C++ 11,所以請不要回復智能指針和信息,特定於C++ 11 ...

我有以下代碼...

class Test 
{ 
public: 
    Test(const int s_id, const std::string s_name) : 
     id(s_id), 
     name(s_name) 
    { 

    }; 
    const int GetID() 
    { 
     return id; 
    } 

private: 
    const int id; 
    const std::string name; 
}; 

class TestCollection 
{ 
public: 
    void AddTest(Test& my_test) 
    { 
     tests[my_test.GetID()] = &my_test; 
    } 

    void RemoveTest(const int id) 
    { 
     if (tests.find(id) != tests.end()) 
     { 
     tests.erase(id); 
     } 
    } 
public: 
    std::map<int, Test*> tests; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TestCollection collection; 
    Test my_test(0, "First Test"); 
    collection.AddTest(my_test); 

    collection.RemoveTest(0); 

    return 0; 
} 

我的問題是,我需要做什麼要清理我在調用RemoveTest時從my_test獲取內存?爲了避免內存泄漏?

我知道,當我使用新的關鍵字,我需要調用刪除...但是我在這種情況下做什麼?

它只是由垃圾收集器自動清理嗎?

+0

這取決於如何分配對象。但更好的發佈實際代碼。 – juanchopanza

+1

該代碼實際上不會編譯。 'tests'只能存儲指針,而你正在嘗試存儲一個引用。 –

+1

您只需要'刪除'用'new'分配的對象。在其他對象上使用'delete'是未定義的行爲(我認爲)。 – Florian

回答

1

在該示例中,collection和my_test都分配在堆棧上。一旦範圍結束(從_tmain返回),內存將被釋放。

將可能存在於變量作用域之外的堆棧變量的指針引起不可預知的行爲。在這種情況下,如果集合獲取對象並存儲指針而不是副本。

+0

什麼是替代方案?要改用指針到處? – Ricky

+0

您可以讓TestCollection類創建要傳遞的對象的副本。該副本將駐留在堆中,並將使用新的副本進行分配。 當調用Remove時,您需要刪除它。調用者不需要使用指針。 – Imran

+0

你能澄清你的意思是來電者嗎? – Ricky

相關問題