2013-04-25 20 views
0

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。但爲什麼這個函數仍然有內存泄漏?

謝謝, 我將不勝感激你的回答!

+0

相關:http://stackoverflow.com/questions/12584815/memory-leak-in-a-list-of-pointers-to-objects – jogojapan 2013-04-25 01:55:56

回答

6

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每個元素已經被動態分配,指針列表是多餘的,基本上是給你一組指針的指針。

2

你應該有unique_ptrlist一個S以便存儲將在銷燬被釋放:

std::list<std::unique_ptr<Employee>> em; 

但正如大衛·布朗說,你不應該使用指針開始進行。

+0

這個工作,但每個列表元素已經獨立動態分配,所以一個'unique_ptr '的列表有點多餘。 – 2013-04-25 01:55:10

+0

@DavidBrown沒關係,我明白你的意思。他不應該有指針。 – 0x499602D2 2013-04-25 02:01:40