C++ 删除列表中创建的对象

C++ 删除列表中创建的对象,c++,string,list,C++,String,List,我正在循环中创建一些对象,并将其添加到列表中: list<MyObject> myList; MyObject* ob = new MyObject(); ob.setAttribute("whatever"); myList.push_back(*ob); 列出myList; MyObject*ob=新的MyObject(); ob.setAttribute(“任何”); myList.push_back(*ob); 循环完成后,我将多次使用该列表。 我现在启动了一个检

我正在循环中创建一些对象,并将其添加到列表中:

list<MyObject> myList;    
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
列出myList;
MyObject*ob=新的MyObject();
ob.setAttribute(“任何”);
myList.push_back(*ob);
循环完成后,我将多次使用该列表。 我现在启动了一个检漏仪,发现我必须删除所有
MyObject
对象

如何正确删除它们(在析构函数中?)。我应该使用迭代器吗?但是我如何得到真正的对象,而不是迭代器指针呢


非常感谢。

这里绝对没有理由动态分配,因为列表按值存储对象。你所做的只是复制和丢弃一个动态对象;它马上就泄露了,因为你在任何地方都没有指向它的指针。只需直接推送对象,必要时复制临时或自动变量:

list<MyObject> myList;    
MyObject ob;
ob.setAttribute("whatever");
myList.push_back(ob);
列出myList;
肌体;
ob.setAttribute(“任何”);
我的列表。推回(ob);
如果您确实需要存储指针,可能是为了多态性,那么您应该使用智能指针来避免泄漏:

list<std::unique_ptr<MyBase>> myList;
std::unique_ptr<MyObject> ob(new MyObject);
ob->setAttribute("whatever");
myList.push_back(ob);
列出myList;
std::唯一的ptr ob(新的MyObject);
ob->setAttribute(“任意”);
我的列表。推回(ob);

如果出于某种原因您真的想处理原始指针,那么是的,您必须自己删除它们。您真的不应该尝试这样做。

这里绝对没有理由动态分配,因为列表按值存储对象。你所做的只是复制和丢弃一个动态对象;它马上就泄露了,因为你在任何地方都没有指向它的指针。只需直接推送对象,必要时复制临时或自动变量:

list<MyObject> myList;    
MyObject ob;
ob.setAttribute("whatever");
myList.push_back(ob);
列出myList;
肌体;
ob.setAttribute(“任何”);
我的列表。推回(ob);
如果您确实需要存储指针,可能是为了多态性,那么您应该使用智能指针来避免泄漏:

list<std::unique_ptr<MyBase>> myList;
std::unique_ptr<MyObject> ob(new MyObject);
ob->setAttribute("whatever");
myList.push_back(ob);
列出myList;
std::唯一的ptr ob(新的MyObject);
ob->setAttribute(“任意”);
我的列表。推回(ob);

如果出于某种原因您真的想处理原始指针,那么是的,您必须自己删除它们。你真的不应该这样做。

你不需要删除它们,它们通过
push\u back()
添加到列表中时会被复制。但是,使用后需要删除
ob
。例如:

list<MyObject> myList;    
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
delete ob;
而且,根据您的程序要求,您可以使用某种智能点来避免此类手动内存管理,例如:

list<std::shared_ptr<MyObject>> myList;    
myList.push_back(new MyObject);
...
// don't need to delete them manually
列出myList;
myList.push_back(新的MyObject);
...
//不需要手动删除它们

您不需要删除它们,它们通过
push_back()
添加到列表中时会被复制。但是,使用后需要删除
ob
。例如:

list<MyObject> myList;    
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
delete ob;
而且,根据您的程序要求,您可以使用某种智能点来避免此类手动内存管理,例如:

list<std::shared_ptr<MyObject>> myList;    
myList.push_back(new MyObject);
...
// don't need to delete them manually
列出myList;
myList.push_back(新的MyObject);
...
//不需要手动删除它们

请注意,您的列表包含原始对象,而不是指向它们的指针。这不会编译-您试图将指针推入对象列表中。除非你有很好的理由去胡闹
new
,只要做
push_back(Object())
,不要担心内存泄漏。对不起,我在问题中写了示例代码,忘了添加一些细节。“我已经修改过了。”丹尼。你的漏洞实际上就在这里:
myList.push_back(*ob)
一旦
ob
超出范围,堆上创建的对象就会泄漏。向后推取了一份
MyObject
。很清楚。我知道泄漏是在哪里产生的。当我只有列表可用时,是否不可能删除析构函数中的对象?请注意,您的列表包含原始对象,而不是指向它们的指针。这不会编译-您试图将指针推入对象列表。除非你有很好的理由去胡闹
new
,只要做
push_back(Object())
,不要担心内存泄漏。对不起,我在问题中写了示例代码,忘了添加一些细节。“我已经修改过了。”丹尼。你的漏洞实际上就在这里:
myList.push_back(*ob)
一旦
ob
超出范围,堆上创建的对象就会泄漏。向后推取了一份
MyObject
。很清楚。我知道泄漏是在哪里产生的。只有列表可用时,是否不可能删除析构函数中的对象?