【问题标题】:Delete objects created during object construction?删除对象构造期间创建的对象?
【发布时间】:2020-07-12 06:20:27
【问题描述】:

如果对象是在这样的类的构造过程中创建的:

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

在析构过程中需要删除vector中的对象吗?

【问题讨论】:

  • 是的,当然。除非你使用 smart_ptrs,这几乎总是一个更好的主意
  • 你需要,除非它们在其他地方被引用,当然

标签: c++ c++11


【解决方案1】:

是的,std::vector &lt; MyObject*&gt; MyObjects 包含指向对象的指针。 vector 假定它不拥有对象,因此默认情况下不会删除它们。

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

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

或者,删除以下所有指针:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2021-04-12
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多