如果我不使用new
来分配类的数据成员,是否还需要在析构函数中进行清理?例如,在以下情况中,我需要delete
向量吗?或者它取决于MyType
?
class A {
A();
~A();
MyType x;
std::vector<MyType> v;
};
A::A() {
x = MyType(42);
v = std::vector<MyType>(5);
}
A::~A() {
// what goes here?
}
答案 0 :(得分:9)
谦虚,取决于{/ 1}}取决于。如果你有MyType
并为typedef char* MyType
分配内存,并且你希望该内存归对象所有,那么是的,你需要一个析构函数。
否则,您不需要为未使用MyType
或new
分配的任何内容释放内存,所以不需要。
你的班级根本不应该有一个析构函数。普遍的共识是你应该在实际需要时只有一个析构函数。使用析构函数还意味着实现赋值运算符和复制构造函数(三个规则)。如果你没有管理任何内存,最好依赖编译器提供的内存 - 如果不这样做,编译器将生成这三个。
此外,构造函数应如下所示:
malloc
否则您的成员将被初始化然后被分配,这是浪费。
答案 1 :(得分:4)
您的类不需要显式析构函数。无论如何都会自动调用vector
的析构函数。由于矢量对象本身(与内部数据相对)不是动态的,因此您不必delete
它。实际上,这是一个语法错误,因为v
不是指针。
答案 2 :(得分:1)
自动调用析构函数,因此您不需要这样做。另外,对于指针,请使用smart pointers(例如std::unique_ptr
)而不是手动delete
。
class A {
A();
~A();
MyType x;
std::vector<MyType> v;
};
A::A() : x(42), v(5) { }
A::~A() {
// x.~MyType() implicitly called.
// v.~std::vector<MyType>() implicitly called.
}
答案 3 :(得分:1)
矢量在销毁时自动删除。但是,如果将指针存储在向量中,例如。如果你说vector&lt; Foo *&gt; v;,你需要编写代码来删除向量中的指针。避免这种情况的一种方法是使用向量&lt; std :: unique_ptr&lt; Foo&gt;&gt;或矢量&lt; std :: shared_ptr&lt; Foo&gt;&gt;
答案 4 :(得分:0)
不,你没必要。他们的构造函数将被隐式调用。
答案 5 :(得分:0)
对于类 A no,您没有,因为它没有使用 new 或 malloc 分配任何指针成员。
请注意,如果您的类/ struct MyType 有任何指针作为成员, MyType 的析构函数负责释放此类指针的内存,但是你不要不必担心类 A 中的那个,因为当它的析构函数被调用时,向量的析构函数会调用 MyType 的析构函数。