在C+中,我必须收集哪些垃圾+;析构函数 我写C++析构函数(我希望这是正确的术语,我是C++的新手),我不知道我需要什么来收集垃圾。假设我有两个指针作为实例变量,我需要垃圾收集它们吗?如果我有一个对象作为实例变量呢?还是指向某个对象的指针

在C+中,我必须收集哪些垃圾+;析构函数 我写C++析构函数(我希望这是正确的术语,我是C++的新手),我不知道我需要什么来收集垃圾。假设我有两个指针作为实例变量,我需要垃圾收集它们吗?如果我有一个对象作为实例变量呢?还是指向某个对象的指针,c++,memory-management,destructor,smart-pointers,raii,C++,Memory Management,Destructor,Smart Pointers,Raii,我只是有点模糊,到底什么需要删除,什么是自动清理 谢谢您需要垃圾收集所有不再需要的指针。否则将出现悬空指针问题。需要释放使用新运算符分配的所有内存 您可以通过执行以下操作来分配内存: int * p1 = new int[5]; p2 = new int; 然后通过执行以下操作将其删除: delete[] p1 delete p2; 如果你在玩类,你需要在构造函数(allocate)和析构函数(deallocate)中做同样的事情。你必须删除你用new分配的每个指针。就这么简单,也这么复杂

我只是有点模糊,到底什么需要删除,什么是自动清理


谢谢

您需要垃圾收集所有不再需要的指针。否则将出现悬空指针问题。

需要释放使用新运算符分配的所有内存

您可以通过执行以下操作来分配内存:

int * p1 = new int[5];
p2 = new int;
然后通过执行以下操作将其删除:

delete[] p1
delete p2; 

如果你在玩类,你需要在构造函数(allocate)和析构函数(deallocate)中做同样的事情。

你必须
删除
你用
new
分配的每个指针。就这么简单,也这么复杂;在删除
之前,您不得丢失
new
分配的任何指针

此外,如果使用
new[]
分配指针,则需要确保调用
delete[]
取消分配指针

这与类实例中碰巧有什么指针无关。您需要知道它们的所有者(所有者负责删除它们)。如果您的对象拥有这些指针,那么它应该删除它们。如果它不拥有它们,那么它就不应该拥有它们


<>这也是为什么有经验的C++程序员在可能的情况下避免使用裸露指针的原因。智能指针允许您用语言在语义上表示所有权类型。这样,你就不必追踪谁拥有什么;根据使用的智能指针类型,您知道谁拥有它。

在理想世界中,什么都没有。每个模式都有智能指针和容器。有时,您必须编写自己的实现,或者扩充现有的实现,但您所需要的大部分已经存在


对于数组,从
std::array
std::vector
开始。对于对象,请阅读智能指针和共享指针。一般来说:如果你需要调用
delete
delete[]
free
,你通常走错了路。

你必须在使用
new
创建的每个空间上调用
delete
,在使用
new[]
创建的每个区域上调用
delete[]
,使用
malloc
获得的一切都是免费的

您还应该关闭所有打开的套接字,并清除类拥有的任何其他操作系统资源


注意:这不是所谓的垃圾收集。垃圾收集是当此过程作为库或语言运行时的一部分自动发生时,而不是当您显式执行时。。。如果您调用了
new
,请调用
delete
。如果您调用了
new[]
,请调用
delete[]
。如果您在类之外访问这些指针并有效地共享它们,那么您需要小心“拥有”对象
delete
在共享对象仍在使用时将其删除。垃圾收集这个词不太合适。您想
销毁对象并
释放其内存。这就是
delete
/
delete[]
所做的
new
/
new[]
分配内存并
构造一个对象


在C++中,没有垃圾回收器。你必须“手动”处理它。这并不是说这一切都是乏味的。您可能会开始使用智能指针来为您处理某些逻辑。有关更多信息,请参阅

> P>您应该先学习“资源获取是初始化”(RAII)和智能指针(<代码> SyddYPPTR <代码>损坏代码> UnQuyPPTR <代码>)。 通常的做法是,无论您在构造函数中分配了什么,都必须在析构函数中解除分配(请参阅其他答案以了解如何分配)。事件更好,尽量多使用值,并尽量少使用新值。 C++喜欢堆栈,堆栈分配和解除分配是自动的和廉价的(没有新的,没有删除)。使用引用和常量引用而不是指针


如果你真的需要动态内存,试着使用一个智能指针。

学究注:你不在C++中“垃圾收集”东西。删除它们。C++没有垃圾回收器。你是想写一个,还是只是想删除析构函数中的一个对象?为什么你不使用智能指针?如果你来自其他语言,C++析构函数概念意味着你脏了,你应该自己清理它。你不能对此粗心大意。你可能想提到
new
new[]
delete
,和
delete[]
之间的区别,这是唯一提到所有权的答案+1.因此,如果我有一个指向某个对象的指针作为实例字段,并且假设没有其他人知道它,那么我必须删除该对象,但不删除指针……这是正确的吗?语法与
delete Address
类似。指针实际上是将地址存储在对象内存中的一些数据。所以,如果你有
int*Number
,您应该使用
删除号码
删除
编号
指向的内容。您并不是在删除指针本身,而是在删除指针指向的内容。语法只需要一个地址,指针存储地址。C++没有垃圾收集。你和问这个问题的人一样困惑。那不是悬而未决的指针,那是内存泄漏。悬空指针是指当您释放它,然后尝试使用它时会发生的情况。它的内存泄漏!,如果您删除并尝试访问它,则会出现悬空!