2010-05-07 84 views
0

list dog; ............. ............關於C++ Lists的問題

因此,我添加了許多狗對象。 如果我打電話dog.pop_front();

內存是否自動取消分配?對於我彈出的對象?

所以,如果我叫

list<Dog*> dog2; 
dog2.push_back(dog.front()); 

,然後我會打電話dog.pop_front()因此,這是否行得通呢?我將假設狗作爲類型結構。

回答

1

你不斷地問這個順序:

list<Dog*> dog2; 
dog2.push_back(dog.front()); // time 1 
dog.pop_front();    // time 2 

在該時間點,無論dog2dog有一個指針指向同一個對象。

在時間2,指向該對象的指針從dog中刪除,並且僅在dog2中。

假設您最初創建該對象與new Dog,對象將不會被釋放,直到你明確地通過調用delete ptr

0

不可以。您仍然需要釋放它。

0

不,您必須通過調用delete或free來釋放它,具體取決於您如何分配它。

0

Dog對象的內存不會被取消分配。您必須使用delete運算符來釋放它。

0

Dog*插入到列表中時,指針的副本被創建並插入到列表中。當你從列表中彈出分配給這個的內存時,指針被釋放。分配給Dog對象的內存未被釋放,因爲它未被列表分配。你必須自己釋放它。

+0

我沒有得到你納文 所以如果我打電話給名單 dog2; dog2.push_back(dog.front()); 然後我會打電話給dog.pop_front() 所以這會起作用嗎? – mousey 2010-05-07 06:03:13

+0

@mousey:是的,這將工作。這裏需要注意的是指針的*副本*被插入到列表中。當你彈出這個副本時被刪除。 – Naveen 2010-05-07 06:06:49

3

Dog對象的內存確實不是被刪除;這你必須自己做。

然而,對於指針的存儲器,Dog*類型,以及任何「列表節點」對象周圍包裹,自動被list類刪除。

+0

所以如果我打電話給名單 dog2; dog2.push_back(狗。面前());然後我會打電話給dog.pop_front()所以這將工作?我將假設狗作爲類型結構。 – mousey 2010-05-07 06:04:24

+0

@mousey如果2個容器保持相同的類型,是的。 – jweyrich 2010-05-07 06:15:39

2

釋放它,我建議一個list<shared_ptr<Dog> >這需要刪除狗的照顧。