如果我有一个list<object*>>* queue
并希望弹出列表中的第一个对象并将其交给程序的另一部分,那么使用它是否正确(粗略代码):
object* objPtr = queue->first();
queue->pop_first();
return objPtr; // is this a pointer to a valid memory address now?
根据http://www.cplusplus.com/reference/stl/list/pop_front/上的文档,它调用了被删除元素的析构函数,但我对它是否意味着链表的节点对象或实际存储的“用户”对象感到困惑。
编辑:我可能是front
而不是first
,我的不好。
答案 0 :(得分:3)
是的,它是一个有效的指针。列表不会释放您分配的内存。 List将销毁其内部而不是用户对象。
答案 1 :(得分:3)
是的,它是有效的:因为您将指针放入列表中,只会破坏指针,而不是对象本身。
答案 2 :(得分:2)
是objPtr
包含指向有效内存的指针。
将元素插入std::list
时,list
会复制该元素。在您的情况下,元素是一个地址(指针),因此列表会复制地址并存储它。
object * optr = queue->pop_front();
optr现在指向对象
queue->pop_front();
从list
移除元素(地址/指针),optr
已指向您的对象。
完成对象后,请不要忘记删除它,否则最终会导致内存泄漏。
示例:
#include <iostream>
#include <list>
using namespace std;
struct A
{
static int count;
A() : val(count++) { cout << "A(" << val << ")" << endl; }
~A() { cout << "~A(" << val << ")" << endl; }
int val;
};
int A::count = 0;
ostream& operator<<(ostream& os, A& a) { return os << a.val; }
int main()
{
list<A*> alist;
for (unsigned int i = 3; i; --i) alist.push_back(new A());
for (unsigned int i = 3; i; --i)
{
A * aptr = alist.front();
alist.pop_front();
cout << *aptr << endl;
delete aptr;
aptr = 0;
}
}
答案 3 :(得分:2)
标准确实说(23.2.2.3/5)调用了元素类型的析构函数。但是这种类型是指针,指针的析构函数什么都不做......
答案 4 :(得分:0)
您的代码很好,但最好使用list< boost::shared_ptr<object> >
。
shared_ptr < object> objPtr = queue->first();
queue->pop_first();
return objPtr;
答案 5 :(得分:0)
删除元素时,STL容器不会破坏堆上分配的用户对象。
class A
{
};
list<A*> PointerToObjectList;
A* ptr = new A();
PointerToObjectList.push_back(ptr);
如果从列表中删除ptr,列表将不会自动删除该对象。一旦不再使用该对象,您需要显式调用delete。