如何释放指针向量?

Tib*_*bor 5 c++ vector object erase delete-operator

如何在指针向量中释放内存?这是代码:

class A
{
    private:
        int x,y,z;
    public:
        A(param1, param2, param3)
        {
            x=param1;
            y=param2;
            z=param3;
        }
        ~A()
        {
            //prompts an alertbox, warning me about the successful call of the destructor;
        }
};

...
vector<A*> list;
list.push_back(new A(1,2,3));

list.erase(list.begin()+index);//SHOULD delete the object from the memory;
list.clear();
Run Code Online (Sandbox Code Playgroud)

我发现.erase()没有释放内存,也没有调用析构函数; 我尝试delete在每个列表条目上使用迭代,但在一次迭代后崩溃.已经检查列表条目是否已经为NULL,以避免任何错误.我错过了什么吗?另外,我必须只使用STL,不需要Boost.

Oli*_*rth 8

list.erase将为其成员元素释放内存(并调用它们的析构函数,如果存在的话); 它不会打电话delete给他们.

提升shared_ptr将是明显的做法.如果您不想使用它,那么您要么编写自己的智能指针类,要么在调用之前迭代list并调用delete每个指针erase.你可以用以下的方式做到这一点:

void my_delete(A *p)
{
    delete p;
}

...

std::for_each(list.begin(), list.end(), my_delete);
Run Code Online (Sandbox Code Playgroud)

  • +1:总是,总是使用智能指针,除非你真的知道你在做什么. (3认同)
  • @Oli,shared_ptr绝对不是显而易见的方式,因为没有意图实际共享这些对象.来自C++ 0x的std :: unique_ptr,boost的ptr_vector或更坏的情况 - 侵入式ptr似乎是更明显的选择. (3认同)

Ale*_*x F 0

for(size_t i = 0; i < list.size(); ++i)
{
    删除列表[i];
}

列表.clear();

如果您做了类似的事情并且代码崩溃了,请发布确切的代码和崩溃信息。