是否删除在对象构造过程中创建的对象

Delete objects created during object construction?

本文关键字:对象 过程中 创建 删除 是否      更新时间:2023-10-16

如果对象是在构造类的过程中创建的,如下所示:

class MyClass
{
private:
std::vector < MyObject*> MyObjects = { new MyObject };
...

在析构函数过程中,我需要删除向量中的对象吗?

是的,std::vector < MyObject*> MyObjects包含指向对象的指针。矢量假定它不拥有这些对象,因此默认情况下不会删除它们。

如果您想自动销毁对象,请更改类型:

std::vector <std::unique_ptr<MyObject>> MyObjects

或者,删除中的所有指针

  1. 析构函数
  2. 赋值运算符
  3. 在构造函数中,以防出现异常。如果出现异常,那么在不进行处理的情况下,向量的一部分将填充对象。由于出现异常,除非明确处理,否则指针不会被删除

使用std::unique_ptr通常是首选解决方案,因为它可以确保释放内存。但这是以没有默认赋值/复制构造函数为代价的。您要么生活在没有分配/复制的环境中,要么只使用移动语义,要么必须显式定义分配/复制。但这并不是一个很大的代价,因为对于简单的指针,您仍然需要定义赋值/复制。