C++內存泄漏和的push_back使用列表類和使用列表類的push_back
void EMAdd(int n)
{
list<Employee*> em;
for (int i = 1; i <= n; i++)
em.push_back(new Employee());
}
Q1 C++內存泄漏。最後,類列表的析構函數會自動刪除em的節點嗎? Q2302。但爲什麼這個函數仍然有內存泄漏?
謝謝, 我將不勝感激你的回答!
C++內存泄漏和的push_back使用列表類和使用列表類的push_back
void EMAdd(int n)
{
list<Employee*> em;
for (int i = 1; i <= n; i++)
em.push_back(new Employee());
}
Q1 C++內存泄漏。最後,類列表的析構函數會自動刪除em的節點嗎? Q2302。但爲什麼這個函數仍然有內存泄漏?
謝謝, 我將不勝感激你的回答!
Employee
的析構函數是而不是調用。您有一個list
的指針到Employee
對象,而不是Employee
對象的列表。當列表的析構函數被調用時,它將銷燬指向Employee
對象的指針,但不會刪除指向new Employee()
創建的對象。他們仍然在記憶中,但是當列表被破壞並泄露了內存時,他們的唯一引用就會丟失。
還記得每個撥打new
的電話都必須在某個地方撥打電話delete
。不過,最好不要使用指針,直接使用Employee
對象列表。
void EMAdd(int n)
{
list<Employee> em;
for (int i = 1; i <= n; i++)
em.push_back(Employee());
}
由於std::list
每個元素已經被動態分配,指針列表是多餘的,基本上是給你一組指針的指針。
你應該有unique_ptr
的list
一個S以便存儲將在銷燬被釋放:
std::list<std::unique_ptr<Employee>> em;
但正如大衛·布朗說,你不應該使用指針開始進行。
這個工作,但每個列表元素已經獨立動態分配,所以一個'unique_ptr
@DavidBrown沒關係,我明白你的意思。他不應該有指針。 – 0x499602D2 2013-04-25 02:01:40
相關:http://stackoverflow.com/questions/12584815/memory-leak-in-a-list-of-pointers-to-objects – jogojapan 2013-04-25 01:55:56