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<> 因为如果您不使用它们的释放方法,它们的析构函数会在对象失去作用域时自动为您完成,从而防止内存泄漏
!
我有我的习惯 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<> 因为如果您不使用它们的释放方法,它们的析构函数会在对象失去作用域时自动为您完成,从而防止内存泄漏 !