list dog; ............. ............關於C++ Lists的問題
因此,我添加了許多狗對象。 如果我打電話dog.pop_front();
內存是否自動取消分配?對於我彈出的對象?
所以,如果我叫
list<Dog*> dog2;
dog2.push_back(dog.front());
,然後我會打電話dog.pop_front()
因此,這是否行得通呢?我將假設狗作爲類型結構。
list dog; ............. ............關於C++ Lists的問題
因此,我添加了許多狗對象。 如果我打電話dog.pop_front();
內存是否自動取消分配?對於我彈出的對象?
所以,如果我叫
list<Dog*> dog2;
dog2.push_back(dog.front());
,然後我會打電話dog.pop_front()
因此,這是否行得通呢?我將假設狗作爲類型結構。
你不斷地問這個順序:
list<Dog*> dog2;
dog2.push_back(dog.front()); // time 1
dog.pop_front(); // time 2
在該時間點,無論dog2
和dog
有一個指針指向同一個對象。
在時間2,指向該對象的指針從dog
中刪除,並且僅在dog2
中。
假設您最初創建該對象與new Dog
,對象將不會被釋放,直到你明確地通過調用delete ptr
不可以。您仍然需要釋放它。
不,您必須通過調用delete或free來釋放它,具體取決於您如何分配它。
否Dog
對象的內存不會被取消分配。您必須使用delete
運算符來釋放它。
將Dog*
插入到列表中時,指針的副本被創建並插入到列表中。當你從列表中彈出分配給這個的內存時,指針被釋放。分配給Dog對象的內存未被釋放,因爲它未被列表分配。你必須自己釋放它。
釋放它,我建議一個list<shared_ptr<Dog> >
這需要刪除狗的照顧。
我沒有得到你納文 所以如果我打電話給名單 dog2; dog2.push_back(dog.front()); 然後我會打電話給dog.pop_front() 所以這會起作用嗎? –
mousey
2010-05-07 06:03:13
@mousey:是的,這將工作。這裏需要注意的是指針的*副本*被插入到列表中。當你彈出這個副本時被刪除。 – Naveen 2010-05-07 06:06:49