【发布时间】:2010-05-07 05:55:06
【问题描述】:
列出狗; ...... …………
所以我添加了许多狗对象。
如果我打电话给dog.pop_front();
内存会自动释放吗?对于我弹出的对象?
如果我打电话
list<Dog*> dog2;
dog2.push_back(dog.front());
然后我会打电话给dog.pop_front() 这样可以吗?我将假设 Dog 作为类型结构。
【问题讨论】:
标签: c++
列出狗; ...... …………
所以我添加了许多狗对象。
如果我打电话给dog.pop_front();
内存会自动释放吗?对于我弹出的对象?
如果我打电话
list<Dog*> dog2;
dog2.push_back(dog.front());
然后我会打电话给dog.pop_front() 这样可以吗?我将假设 Dog 作为类型结构。
【问题讨论】:
标签: c++
Dog 对象的内存不会被删除;这个你必须自己做。
但是,Dog* 类型的指针的内存,以及围绕它的任何“列表节点”对象,将被 list 类自动删除。 p>
【讨论】:
我建议list<shared_ptr<Dog> > 负责删除狗。
【讨论】:
你一直在问这个序列:
list<Dog*> dog2;
dog2.push_back(dog.front()); // time 1
dog.pop_front(); // time 2
在时间 1,dog2 和 dog 都有一个指向同一个对象的指针。
在时间 2,指向该对象的指针从 dog 中删除,并且仅在 dog2 中。
假设您最初使用new Dog 创建了该对象,则在您通过调用delete ptr 明确释放它之前,该对象不会被释放
【讨论】:
没有。你仍然需要释放它。
【讨论】:
不,您必须自己通过调用 delete 或 free 来解除分配,具体取决于您的分配方式。
【讨论】:
没有。 Dog 对象的内存不会被释放。您必须使用 delete 运算符来释放它。
【讨论】:
当您将Dog* 插入到列表中时,会创建一个指针 的副本并将其插入到列表中。当你从列表中弹出时,分配给这个指针的内存被释放。为 Dog 对象分配的内存没有被释放,因为它不是由列表分配的。你必须自己释放它。
【讨论】: