C++ 释放自定义矢量的正确方法 class

C++ Correct way to free a vector of a custom class

我有我的习惯 class,例如:

class MyClass {

   public:
        int i;
        std:string name;

        void DoSomeStuff();

}

和另一个 class 包含我的自定义列表 class:

class MyClassList {

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

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

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

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

感谢您的帮助...

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

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

请注意,您可以而且必须 delete 仅使用 new 分配的内容,并且恰好一次。同样适用于 new[]delete[]。拥有一个必须删除的成员是您自己的析构函数有意义的情况,尽管将资源处理留给资源处理程序(如智能指针和 std::vector 通常是可行的方法。

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

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

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