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

问题描述

| 我有一个指向对象的指针。我需要从向量中删除一个元素并将该元素放置在另一个列表中。 我读到擦除可用于从向量中删除对象,但我也读到它在执行此操作之前会调用对象析构函数。 我需要知道擦除对象是否也会将其破坏。     

解决方法

        
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文档。 更通用,更优雅的解决方案: 此解决方案使用@Billy在评论中指出的
for_each
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
类对象的指针的向量。 用法示例:
#include \"functional\"
#include \"vector\"
#include \"algorithm\"
#include \"iostream\"

//Your class
class myclass
{
    public:
        int i;
        myclass():i(10){}
};


// 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;
    }
};


int main()
{
    // Add 10 objects to the vector.
    std::vector<myclass*> myclassVector;

    for( int Index = 0; Index < 10; ++Index )
    {
        myclassVector.push_back( new myclass);
    }

    for (int i=0; i<myclassVector.size(); i++) 
    {
        std::cout << \" \" << (myclassVector[i])->i;
    }

    // Now delete the vector contents in a single  line.
    for_each( myclassVector.begin(),DeleteVector<myclass*>());

    //Clear the vector 
    myclassVector.clear();

    std::cout<<\"\\n\"<<myclassVector.size();

    return 0;
}
    ,         如果您有
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();
}
    ,        是的,当然可以。如果向量中不存在该对象,那么它将在其他地方存在? 编辑:这不会删除指针指向的任何内容。您应该使用自动生命周期管理指针(例如
shared_ptr
)来管理对象生命周期。     ,        是的,ѭ17破坏了元素。但是,如果将元素放置在另一个容器中,则可能会进行复制,将其放入另一个容器中。遇到问题的唯一方法是将指针或类似内容复制到另一个容器中。     ,        是。 “ 0”销毁删除的对象,这涉及调用其析构函数。