在我的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;
}
没有“删除”部分,这样可以正常工作。我添加它是因为我认为对象的内存没有被释放。
答案 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);