Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我需要清理非指针数据成员吗?_C++_Destructor - Fatal编程技术网

C++ 我需要清理非指针数据成员吗?

C++ 我需要清理非指针数据成员吗?,c++,destructor,C++,Destructor,如果我不使用new分配类的数据成员,是否仍需要在析构函数中进行清理?例如,在以下情况下,我是否需要删除向量?还是取决于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? } A类{ A(); ~A();

如果我不使用
new
分配类的数据成员,是否仍需要在析构函数中进行清理?例如,在以下情况下,我是否需要删除向量?还是取决于
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?
}
A类{
A();
~A();
myx型;
std::向量v;
};
A::A(){
x=MyType(42);
v=标准::向量(5);
}
A::~A(){
//这里有什么?
}

析构函数是自动调用的,因此您无需这样做。此外,对于指针,请使用(例如
std::unique_ptr
)而不是手动删除它们

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.
}
A类{
A();
~A();
myx型;
std::向量v;
};
A::A():x(42),v(5){}
A::~A(){
//隐式调用了x.~MyType()。
//隐式调用了v.~std::vector()。
}

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

不,您不必这样做。它们的构造函数将被隐式调用。

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

否则,您不需要为未分配给
new
malloc
的任何内容释放内存,因此不需要

您的类甚至不应该有析构函数。大家普遍认为,只有在实际需要时才应该有析构函数。拥有析构函数还意味着实现赋值运算符和复制构造函数(三个规则)。如果您不管理任何内存,最好依赖编译器提供的内存,即如果您不管理,编译器将生成这三个

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

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

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

向量将在销毁时自动删除。但是,如果将指针存储在向量中,例如,如果说向量v;,您需要编写代码来删除向量中的指针。避免这种情况的一种方法是对类A使用vector或vector

,因为它没有使用new或malloc分配任何指针成员


请注意,如果您的类/结构MyType有任何指针作为成员,MyType的析构函数负责释放此类指针的内存,但在类a中,您不必担心这一点,因为在调用其析构函数时,向量的析构函数调用MyType的析构函数。

所以“三个规则”在这种情况下不适用,因为我只需要一个显式构造函数?规则3是复制ctor、dtor和重载=。不是其他的演员。@djechlin:噢。这是有道理的。在这种情况下,不需要dtor。请记住,“RAII”中的“R”代表资源,而不是内存。有时您需要释放dtor中除内存之外的其他内容。@JohnDibling但这(至少第二部分)是基于这样一种假设,即资源的特定所有者被销毁时,资源会被释放。因此,如果
MyType
获取一个资源并在其析构函数中释放它,就可以了。在这种情况下:一个对象最多应该管理一个资源。如果需要管理两个资源,请将它们包装在两个成员中,每个成员管理一个资源。除非
MyType
是指针,在这种情况下,不会调用析构函数,您将泄漏内存。@LuchianGrigore如果
MyType
已被
typedef
fed?@Andreas或带有define
#define MyType X*
:)是否正确