如何删除集合中的对象

时间:2011-04-30 01:49:35

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

在我的C ++程序中,我使用new在一个函数中创建对象。这些对象被插入到一个集合中。当我想从集合中删除对象时,我在for循环中使用了一个迭代器。当我从集合中删除对象时,我仍然需要删除该对象以释放其内存,对吗?我尝试使用删除,但后来我得到一个错误,说没有分配被释放的指针。那怎么办呢?

这是我创建对象然后将其插入集合

的代码
set <myObject> myobjectlist;
myObject *myobject = new myObject;
myobjectlist.insert(*myobject);

在另一个函数中,我尝试从集合中删除一个对象,并释放它的内存:

    for (set<myObject>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++)
if (i->myObjectID == myObjectID)
{
    myobjectlist.erase(*i);
    delete &i;
    break;
}

没有“删除”部分,这样可以正常工作。我添加它是因为我认为对象的内存没有被释放。

4 个答案:

答案 0 :(得分:10)

假设您正在调用set的erase()方法,请注意这将为您调用对象的析构函数。在erase()对象之后,它已经delete d,因此第二次手动调用delete的尝试将失败,因为指针不再被分配。

供参考,请参阅this

答案 1 :(得分:3)

是的,您需要删除您创建的对象。但是,您的集合中的内容不一定是您分配的内容。例如,您的集合可能包含对象值(而不是指针),并且在插入后泄漏了已分配的对象。邮政编码。

编辑: 就是这样。您的集合不存储指针,它存储您要分配的对象的副本。从擦除循环中删除删除并插入如下对象:

set <myObject> myobjectlist;
myobjectlist.insert(myObject());

或者,只需将您的设置设为set<myObject*>

此外,erase需要一个迭代器 - 无需deref它。

答案 2 :(得分:3)

这是您想要的,假设您需要使用new来分配这些对象:

  set <myObject*> myobjectlist;     
  myObject *myobject = new myObject;
  myobjectlist.insert(myobject); //insert the pointer, not the object

  for (set<myObject*>::iterator i = myobjectlist.begin(); i != myobjectlist.end(); i++) {
    if ((*i)->myObjectID == myObjectID) {
      myobjectlist.erase(i);
      delete *i;
      break;
    }
  }

答案 3 :(得分:2)

如果需要指针列表,请使用智能指针列表。 使用std算法查找正确的项目并从列表中删除它。

#include <set>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>

using namespace boost;

typedef boost::shared_ptr<MyObject> t_object;
std::set<t_object> myObjectList;
myObjectList.insert(t_object(new MyObject));

std::set<t_object>::iterator item = std::find_if(
    myObjectList.begin(), 
    myObjectList.end(), 
    bind(&MyObject::myObjectID, _1)== myObjectID);
if(item!=myObjectList.end())
    myObjectList.erase(item);