0

我有我的自定义课程,例如:

class MyClass {

   public:
        int i;
        std:string name;

        void DoSomeStuff();

}

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

class MyClassList {

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

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

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

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

感谢您的帮助...

4

3 回答 3

5

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

于 2015-04-28T18:45:44.170 回答
2

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

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

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

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

于 2015-04-28T18:46:34.103 回答
0

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

于 2015-04-29T01:30:13.297 回答