澄清清单和删除元素

时间:2009-10-14 11:33:09

标签: c++ list stl pointers object

如果我有一个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,我的不好。

6 个答案:

答案 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。