【问题标题】:Can't delete and erase object pointer on a vector无法删除和擦除矢量上的对象指针
【发布时间】:2012-06-19 19:02:01
【问题描述】:

我需要删除和擦除向量上的对象指针。 我看到了这个问题Should we delete before or after erase for an pointer in the vector?,但删除对象指针后我无法擦除。

如何解决?这是我的代码。

#include <iostream>
#include <vector>
using namespace std;

class Foo
{
public:
    class bar
    {
    public:
        Foo &_owner;
        int _id;
        bar(Foo &owner,int id) : _id(id), _owner(owner){}
        void remove()
        {
            for(vector<bar*>::iterator it=_owner.vbar.begin();it<_owner.vbar.end();it++)
            {
                if((*it)->_id == _id)
                {
                    //delete object pointer
                    delete * it;

                    //remove element
                    it = _owner.vbar.erase(it); // error on this line.
                }
            }
        }
    };
    vector<bar*> vbar;
    Foo()
    {
        // add 10 elements
        for(int i=0;i<10;i++)
            vbar.push_back(new bar(*this ,i));

        // remove element at 3
        vbar.at(3)->remove();
    }
};

int main(int argc, char *argv[])
{
    Foo foo;
    return 0;
}

[已编辑] 我通过从 Bar 类外部删除对象指针来解决这个问题(在 Foo 类上删除) 通过像这样在 Foo 类上添加不再使用 bar id 到向量。

#include <iostream>
#include <vector>
using namespace std;

class Foo
{
public:
    class bar
    {
    public:
        Foo &_owner;
        int _id;
        bar(Foo &owner,int id) : _id(id), _owner(owner) {}
        void remove()
        {
            _owner.removeId = _id;
            _owner.removeHelper();
        }
    };
    vector<bar*> vbar;
    int removeId;
    Foo()
    {
        removeId = -1;

        // add 10 elements
        for(int i=0; i<10; i++)
            vbar.push_back(new bar(*this ,i));

        // remove element at 3
        vbar.at(3)->remove();
    }
    void removeHelper()
    {
        for(vector<bar*>::iterator it=vbar.begin(); it<vbar.end(); it++)
        {
            if((*it)->_id == removeId)
            {
                //delete object pointer
                delete * it;

                //remove element
                it = vbar.erase(it);
                break;
            }
        }
        removeId = -1;
    }
};

int main(int argc, char *argv[])
{
    Foo foo;
    return 0;
}

【问题讨论】:

  • std::shared_ptr 是你的朋友。

标签: c++ pointers object vector delete-operator


【解决方案1】:

问题隐藏在这里

//delete object pointer
delete * it;

在这种情况下相当于delete this

之后,使用当前对象的任何部分都是未定义的行为。下一轮循环不会起作用。

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2019-01-14
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多