3

如果我不使用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?
}
4

6 回答 6

9

要迂腐,这取决于是什么MyType。如果您有typedef char* MyType并且为 分配内存MyType,并且希望该内存归对象所有,那么是的,您需要一个析构函数。

否则,您不需要为未使用newor分配的任何内容释放内存malloc,因此不需要。

您的班级甚至根本不应该有析构函数。有一个普遍的共识是你应该只在你真正需要的时候使用析构函数。拥有析构函数还意味着实现赋值运算符和复制构造函数(三规则)。如果您不管理任何内存,最好依赖编译器提供的内存 - 即如果您不管理,编译器将生成这三个。

此外,您的构造函数应如下所示:

A::A() : x(42), v(5){
}

否则你的成员将被初始化然后分配给,这是浪费的。

于 2012-06-13T19:05:46.833 回答
4

您的类不需要显式析构函数。vector无论如何都会自动调用 's 的析构函数。而且由于矢量对象本身(与内部的数据相反)不是动态的,因此您不必这样做delete。事实上,这将是一个语法错误,因为v它不是一个指针。

于 2012-06-13T19:03:50.870 回答
1

析构函数是自动调用的,所以你不需要这样做。此外,对于指针,请使用智能指针(例如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.
}
于 2012-06-13T19:03:38.223 回答
1

向量在销毁时会自动删除。但是,如果您将指针存储在向量中,例如,如果您说 vector<Foo *> v;,则需要编写代码来删除向量中的指针。避免这种情况的一种方法是使用 vector<std::unique_ptr<Foo>> 或 vector<std::shared_ptr<Foo>>

于 2012-06-13T19:06:08.020 回答
0

不,你不必。它们的构造函数将被隐式调用。

于 2012-06-13T19:04:16.987 回答
0

对于A类,不,你没有,因为它没有使用newmalloc分配的任何指针成员。

Beware that if your class/struct MyType have any pointers as a member, the destructor of MyType is the responsible to free the memory of such pointer, but you don't have to worry with that in class A, since when its destructor is called, the destructor of the vector calls the destructor of MyType.

于 2012-06-13T19:11:55.917 回答