对象指针向量上的vector :: erase()是否会破坏对象本身?

时间:2011-06-15 04:50:08

标签: c++ stl vector

我有一个指向对象的向量。我需要从向量中删除一个元素并将该元素放在另一个列表中。

我读到擦除可以用来从向量中删除对象,但我还读到它在执行之前调用对象析构函数。

我需要知道擦除对象是否也会破坏它。

5 个答案:

答案 0 :(得分:58)

vector::erase
从向量容器中删除并调用其析构函数,但如果包含的对象是指针,则它不会取得破坏它的所有权。

您必须在每个包含的指针上显式调用delete以删除它指向的内容,例如:

void clearVectorContents( std::vector <YourClass*> & a ) 
{    
    for ( int i = 0; i < a.size(); i++ ) 
    {       
        delete a[i];    
    }    
    a.clear(); 
} 

在标准容器中存储原始指针不是一个好主意。如果您确实需要存储必须由new分配的资源,那么您应该使用boost::shared_ptr。查看Boost documentation

更通用的&amp;优雅的解决方案:
此解决方案使用for_each&amp; {@ 1}} @Billy在评论中指出:

templates

这可以称为:

// Functor for deleting pointers in vector.
template<class T> class DeleteVector
{
    public:
    // Overloaded () operator.
    // This will be called by for_each() function.
    bool operator()(T x) const
    {
        // Delete pointer.
        delete x;
        return true;
    }
};

其中,for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>()); 是包含指向myclassVector类对象的指针的向量。

用法示例:

myclass

答案 1 :(得分:9)

  • 如果您有vector<MyObject>,则会MyObject::~MyObject 调用。
  • 如果您有vector<MyObject*>,则不会调用delete <MyObject instance>

要在两个向量之间移动MyObject,您需要先将其插入目标向量,然后擦除原始向量。请注意,这将创建对象的新副本。移动指针时,您可以将指针保存在临时变量中,将其从矢量中删除,然后插入到您需要的任何位置。

这是删除并删除向量中所有项目的另一种简单方法:

template<class T> void purge( std::vector<T> & v ) {
    for ( auto item : v ) delete item;
    v.clear();
}

答案 2 :(得分:2)

是的,当然会。如果矢量中不存在该对象,那么它还存在于哪里?

编辑:这将删除指针指向的任何内容。您应该使用自动生命周期管理指针(如shared_ptr)来管理对象生命周期。

答案 3 :(得分:2)

是的,erase会破坏元素。但是,如果您将元素放在另一个容器中,则可能会将其复制到另一个容器中。遇到问题的唯一方法是将指针或类似的东西复制到另一个容器中。

答案 4 :(得分:2)

是。 vector::erase销毁被删除的对象,包括调用它的析构函数。