我是否需要清理非指针数据成员?

时间:2012-06-13 19:01:45

标签: c++ destructor

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

6 个答案:

答案 0 :(得分:9)

谦虚,取决于{/ 1}}取决于。如果你有MyType并为typedef char* MyType分配内存,并且你希望该内存归对象所有,那么是的,你需要一个析构函数。

否则,您不需要为未使用MyTypenew分配的任何内容释放内存,所以不需要。

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

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

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 的析构函数。