删除列表中创建的对象
Delete created Objects inside List
我在循环中创建了一些对象,并将其添加到列表中:
list<MyObject> myList;
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
循环结束后,我将多次使用该列表。我现在已经启动了一个泄漏检测器,并且看到,我必须删除所有的MyObject
对象。
如何正确地删除它们(在析构函数中?)我应该使用迭代器吗?但是我如何得到真正的对象,而不是迭代器指针呢?
这里绝对没有理由进行动态分配,因为列表是按值存储对象的。你所做的只是复制和丢弃一个动态对象;它会立即泄露,因为你没有在任何地方保存指向它的指针。直接推入对象,必要时复制临时变量或自动变量:
list<MyObject> myList;
MyObject ob;
ob.setAttribute("whatever");
myList.push_back(ob);
如果你确实需要存储指针,也许是为了多态,那么你应该使用智能指针来避免泄漏:
list<std::unique_ptr<MyBase>> myList;
std::unique_ptr<MyObject> ob(new MyObject);
ob->setAttribute("whatever");
myList.push_back(ob);
如果出于某种原因你真的想要篡改原始指针,那么是的,你必须自己删除它们。你真的不应该那样做
您不需要删除它们,它们在被push_back()
添加到列表中时被复制。但是,您需要在使用后删除ob
。如:
list<MyObject> myList;
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
delete ob;
基本上,您不需要在这里使用指针,您可以在堆栈中声明ob
以避免手动内存管理:
list<MyObject> myList;
MyObject ob;
ob.setAttribute("whatever");
myList.push_back(ob);
并且,根据您的程序需求,您可以使用某种智能点来避免这种手动内存管理,例如:
list<std::shared_ptr<MyObject>> myList;
myList.push_back(new MyObject);
...
// don't need to delete them manually
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针