动态分配的成员变量。什么';重点是什么? 我对C++完全陌生。我想问一下以下问题

动态分配的成员变量。什么';重点是什么? 我对C++完全陌生。我想问一下以下问题,c++,dynamic,allocation,C++,Dynamic,Allocation,如果在构造函数中动态分配成员变量。是否应该始终在析构函数中删除它?如果是这样,那么变量的生命周期是如何“延长”的?否则,应如何处理内存泄漏 我找不到任何明确解决此问题的来源 动态分配成员的原因如下 数组的大小可能是非常量的 成员可能非常大,因此堆栈上没有足够的内存 正如MSalters所评论的,该成员是多态的 但是,正如Alf在评论中指出的,最好使用智能指针。这样做的好处是,您不需要显式地删除析构函数中的该成员,并且在共享的情况下,您可以根据需要延长生存时间,智能指针负责销毁。动态分配成员的

如果在构造函数中动态分配成员变量。是否应该始终在析构函数中删除它?如果是这样,那么变量的生命周期是如何“延长”的?否则,应如何处理内存泄漏


我找不到任何明确解决此问题的来源

动态分配成员的原因如下

  • 数组的大小可能是非常量的
  • 成员可能非常大,因此堆栈上没有足够的内存
  • 正如MSalters所评论的,该成员是多态的

但是,正如Alf在评论中指出的,最好使用智能指针。这样做的好处是,您不需要显式地
删除析构函数中的该成员,并且在
共享的情况下,您可以根据需要延长生存时间,智能指针负责销毁。

动态分配成员的原因如下:

  • 数组的大小可能是非常量的
  • 成员可能非常大,因此堆栈上没有足够的内存
  • 正如MSalters所评论的,该成员是多态的
但是,正如Alf在评论中指出的,最好使用智能指针。这样做的好处是,您不需要显式地
删除析构函数中的该成员,并且在
共享的情况下,您可以根据需要延长提升时间,智能指针负责销毁

是否应该始终在析构函数中删除它

这不是必须的-如果您确定不再使用其他函数,您可以在其他函数完成工作后立即释放内存。但是,无论如何,您必须从析构函数调用这个销毁例程,以避免内存泄漏。理想情况下,您还需要提供另一个函数来重新分配内存

简言之,这完全取决于您的类和您实现的内容

是否应该始终在析构函数中删除它

这不是必须的-如果您确定不再使用其他函数,您可以在其他函数完成工作后立即释放内存。但是,无论如何,您必须从析构函数调用这个销毁例程,以避免内存泄漏。理想情况下,您还需要提供另一个函数来重新分配内存


简言之,这一切都取决于你的班级和你正在实施什么。

让我采取一些后现代的方法,说“你不必再担心它了”

使用
unique_ptr
如果只有创建对象负责该资源,如果许多对象共享该资源,则使用
shared_ptr
。将STL容器用于所有其他可能的用途


只有在编写极低级的内容或从头开始实现容器时,才使用
new
delete
。对于所有其他情况,请将动态内存分配(通过
malloc
new
查看)视为已弃用

让我采取一些后现代的方法,说“你不必再担心它了”

使用
unique_ptr
如果只有创建对象负责该资源,如果许多对象共享该资源,则使用
shared_ptr
。将STL容器用于所有其他可能的用途


只有在编写极低级的内容或从头开始实现容器时,才使用
new
delete
。对于所有其他情况,请将动态内存分配(通过
malloc
new
查看)视为已弃用

对于动态分配的数据成员,您需要负责复制和移动。除此之外,还有一种可能是在析构函数中删除。但最好使用智能指针,例如
std::unique_ptr
(如果可能,最好使用标准库容器)。您需要的是智能指针。C++库中有一些预定义的智能指针。要么使用它们,要么自己设计。所以如果我使用智能指针,我还需要使用移动构造函数吗?@D.Badawi:如果你使用智能指针,你不需要编写移动构造函数。在某些地方,您可能仍然需要告诉编译器可以使用默认的移动构造函数。原因是移动会改变源对象。编译器只有在安全的情况下才会这样做,要么是因为它看到它是安全的,要么是因为你告诉它是安全的。@D.Badawi:事实证明,直接拥有多个动态分配的成员是有风险的。例如,不要将两个
int*
数组作为成员。但是,可以有2个
std::vector
成员。它们各自包装一个动态分配的
int*
数组,并且都有一个专用的
std::vector::~vector
来清理单个分配。确切原因很难在注释中解释,但粗略地说,如果构造函数未能分配第二个资源,则不会调用析构函数,这意味着它无法清理第一个资源。对于动态分配的数据成员,您需要负责复制和移动。除此之外,还有一种可能是在析构函数中删除。但最好使用智能指针,例如
std::unique_ptr
(如果可能,最好使用标准库容器)。您需要的是智能指针。C++库中有一些预定义的智能指针。要么使用它们,要么自己设计。所以如果我使用智能指针,我还需要使用移动构造函数吗?@D.Badawi:如果你使用智能指针,你不需要编写移动构造函数。在某些地方,您可能仍然需要告诉编译器可以使用默认的移动构造函数。原因是移动会改变源对象。编译器只有在安全的情况下才会这样做,要么是因为它看到它是安全的,要么是因为你告诉它是安全的。@D.Badawi:它变成了o