C++ 释放自定义类向量的正确方法
C++ Correct way to free a vector of a custom class
我有我的自定义类,比如:
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<>,因为如果您不使用他们的发布方法,他们的析构函数将在对象失去范围时自动为您执行此操作,防止内存泄漏!
- C++从另一个类访问公共静态向量的正确方法是什么
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 声明高维向量的更简洁的方法
- 在C++中初始化向量映射的最有效方法
- C++11 迭代向量的新方法?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 访问类成员向量最后一项的正确方法
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 方法向量的新/分配的复杂性::p ush_back
- C++调用另一个类中的类方法向量
- 自己的"Insert"方法(向量)函数模板
- 最有效的计算集合A对集合B的补的方法(向量)