2015-11-13 78 views
1

我在C++中使用std :: forward_list來存儲動態分配的元素。我想知道什麼是刪除列表中的元素或釋放內存的正確方法。如何刪除存儲在std :: forward_list中的動態元素

std::forward_list<int> integerList; 

for (int i = 0; i < 5; i++) { 
    int* intPtr = new int(i); 
    integerList.push_front(*intPtr); 
} 

這段代碼執行後,我認爲應該發生的是forward_list包含一個動態分配的int。現在,我將如何正確調用刪除它呢?我注意到forward_list容器有一個clear()函數,但是它是否會調用每個節點中所有元素的delete?

+1

'我在C++中使用std :: forward_list來存儲動態分配的元素。「嗯不,你根本就沒有這樣做。您將存儲這些元素的*副本並泄漏原始文件。 – Borgleader

+0

@Borgleader好抓。我錯過了。 –

+0

謝謝你們,這很有道理。那麼刪除原件的正確方法是什麼,並確保我不會泄漏它?我應該添加刪除intPtr;在for循環的最後一行? – AWoodman

回答

1

我認爲應該發生的是修飾符Modifiers保存了動態分配的INT

不,不持有動態分配int。元素的類型是int,當integerList.push_front(*intPtr);時,該值將被複制。

另一方面,你得到一個內存泄漏的for循環,你需要deletenew編輯。

for (int i = 0; i < 5; i++) { 
    int* intPtr = new int(i); 
    integerList.push_front(*intPtr); 
    delete intPtr; 
} 

如果你想保存動態分配的元素,你應該聲明元素的類型爲指針,並且最後自己刪除元素。

std::forward_list<int*> integerList; 
for (int i = 0; i < 5; i++) { 
    int* intPtr = new int(i); 
    integerList.push_front(intPtr); 
} 
... 
for (auto e : integerList) { 
    delete e; 
} 

而且你可以使用智能指針,以避免這種內存管理,如std::unique_ptrstd::shared_ptr

-1

是的,你將不得不遍歷整個列表並調用刪除每個指針元素。

+0

錯,查看列表的類型(以及每個元素的添加方式) – Borgleader

+0

正確,我錯過了。讓我們假設這是糾正:)。 –