从迭代器找到的向量中擦除对象会导致分段错误

时间:2015-03-20 00:12:36

标签: c++ vector segmentation-fault

我有一个名为Object的类,其定义如下:

#include "Object.hpp"

Object::Object()
{
    id = 0;
}

int Object::Id()
{
    return id;
}

void Object::setId(int i)
{
    id = i;
}

我有一个容器类,它包含一堆名为Object的{​​{1}}个DataSet。我目前正在std::vector中持有它们。在DataSet标题文件中,我有我想要执行的这些功能,而且我还有std::vector Object个:

class DataSet{
public:
    std::vector<Object*> objects;
    DataSet();
    ~DataSet();
    int addObject(Object *object);
    void clear();
    int deleteObject(Object *object);
    int getSize();
};

由于我的Object现在基本上只与ID相关联,因此我希望能够使用查找和删除具有特定ID的Object。但是,在调用objects.erase时,我最终会遇到段错误。这是我的方法:

int DataSet::deleteObject(Object* object)
{
    std::vector<Object*>::iterator iterator;
    if(object) {
        iterator = find(objects.begin(), objects.end(), object);
        delete *iterator;
        objects.erase(iterator);    // seg fault
    }
    return 1;
}

在我的driver中,以下是我通过ID删除内容的方法:

void execRemove(int id)
{
    DataSet dm;
    Object *temp = new Object();
    temp->setId(id);
    dm.deleteObject(temp);
}

为什么在迭代器上调用erase会导致seg错误?同样在我的deleteObject我的唯一要求是我使用iteratorfind,因为我正在衡量从{{1}移除Object所需的时间数百万。

编辑:作为旁注,这个std::vector正在通过这样做来初始化:

DataSet

调用for(int i = 0; i < 1000000; ++i) { Object* object = new Object(); object->setId(i); dm.addObject(object); // dm is our dataset container } 会导致段错误,即使execRemove(20)肯定有dm

0 个答案:

没有答案