【发布时间】:2020-11-11 02:20:36
【问题描述】:
在 C++ 中,什么决定了要引用的堆分配对象? Mark Allen Weiss 在他的《Data Structures and Algorithm Analysis in C++》一书中写道“当一个对象被 new 分配的不再引用时,必须对对象应用删除操作(通过指针)”我觉得这句话有点令人困惑的是,我所理解的是指针持有对内存地址的引用,但是代表这个地址的对象是如何被其他东西引用的呢?当其他东西不再引用它时,我必须调用删除?
【问题讨论】:
-
int *a = new int{1}; int *b = a;a和b都引用了new int{1}分配的内存 -
@AbdelRahmanMahmoud 在那个例子中,只有一个堆分配的对象,所以只有一个要删除的对象。
-
这没关系,但在许多情况下是不必要的。同样,删除后
a仍将指向您删除的内存,但是在释放内存后,您不能再次取消引用指针。 -
@AbdelRahmanMahmoud 这完全不正确。没有关于“引用”和
delete的规则。规则是你应该在deletenew分配的对象当你不再需要它们时。 -
@AbdelRahmanMahmoud 成为坏习惯的原因有很多。一个是如果你有两个指向同一个对象的指针,你不能总是将两者都设置为
nullptr,所以你不能确保指针是有效的或者nullptr无论如何,所以没有任何好处。另一个是它可以隐藏代码所依赖的信息,例如指针先前指向有效对象的事实。您不能仅仅假设插入b = nullptr是安全的;在某些代码中的free (b);之后。
标签: c++ memory heap-memory allocation