C++ 释放自定义类向量的正确方法



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

class MyClass {
   public:
        int i;
        std:string name;
        void DoSomeStuff();
}

还有另一个类,其中包含我的自定义类列表:

class MyClassList {
    public:
        std::vector<MyClasss> myClassList;
}

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

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

该代码是对的,冗余的还是错误的?

感谢您的帮助...

你不需要做任何事情,只要让它超出范围。RAII 将确保在您的实例超出范围时清理矢量内存MyClassList

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

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

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

此原则适用于所有设计良好的类,称为 RAII。

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

最新更新