【问题标题】:C++ Correct way to free a vector of a custom classC++ 释放自定义类向量的正确方法
【发布时间】:2015-07-07 18:38:16
【问题描述】:

我有我的自定义类,例如:

class MyClass {

   public:
        int i;
        std:string name;

        void DoSomeStuff();

}

和另一个带有我的自定义类列表的类:

class MyClassList {

    public:
        std::vector<MyClasss> myClassList;
}

列表析构函数应该如何释放内存中所有使用的向量空间:

MyClassList::~MyClassList 
{
    myClassList.clear();
    delete &myClassList;
}

该代码是正确的、多余的还是错误的?

感谢您的帮助...

【问题讨论】:

  • 你不需要在析构函数中删除。当调用析构函数时,它会自动清理所有内容
  • delete &amp;myClassList; 完全不正确。只有deletenew。从您向我们展示的不完整的 sn-ps 来看,MyClassList 不需要析构函数定义。隐式定义的就足够了。
  • 错了,别做任何事。 vector 管理自己的内存,并且您的类成员不是动态分配的。你new了吗?不?然后不要删除。
  • 那么,我将在这里使用一个空的析构函数:{},对吧?
  • 您甚至不需要定义析构函数,编译器会为您创建一个,它会按照您的意愿完美运行。

标签: c++ memory vector destructor resource-management


【解决方案1】:

您无需执行任何操作,只需让它超出范围即可。 RAII 将确保在您的 MyClassList 实例超出范围时清理矢量内存。

【讨论】:

    【解决方案2】:

    此代码是多余的(正如 Cyber​​ 指出的那样甚至不正确,因为您不允许 delete 向量)。

    请注意,您可以而且必须 delete 只分配使用 new 的东西,并且只能分配一次。同样适用于new[]delete[]。拥有必须删除的成员将是您自己的析构函数有意义的情况,尽管将资源处理留给诸如智能指针和std::vector之类的资源处理程序通常是要走的路。

    隐式生成的析构函数将以相反的构造顺序销毁所有成员和基,即它将以正确的顺序调用它们的所有析构函数。所以std::vector的析构函数会被调用并释放它拥有的所有资源。

    此原则适用于所有精心设计的类,称为RAII

    【讨论】:

    • 这不是多余的,它是完全不正确和非法的。你不能delete你没有new
    【解决方案3】:

    由于一切都是在堆栈上创建的,一旦您从 List 类实例化的对象离开作用域,它的隐式析构函数将为您调用 std::vector 的析构函数。如果你想确保你可以拥有自己的析构函数并使用你的成员变量 vector's.clear() 来清除它的内容。唯一需要删除的时候是在堆上创建新内存时!但是,我不会使用 new 和 delete,除非 new 和 delete 调用在您的类私有方法中并且都在同一个方法中,或者如果 new 在构造函数中并且 delete 在析构函数中。即使这样,使用 shared_ptr 和 unique_ptr 仍然更好,因为如果你不使用它们的释放方法,它们的析构函数会在对象失去作用域时自动为你做这件事,防止内存泄漏 !

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多