为什么C ++中的堆中的垃圾位置没有被设计为可以自行重新分配?

时间:2017-09-26 04:19:04

标签: c++ pointers garbage-collection garbage

我正在学习堆,我被告知如果我们必须重新分配指向新地址的指针,我们必须删除指针所指向的堆的地址中的内容,或者该内容变为垃圾并且可能导致内存泄漏。像:

int* x = new int(10);
//delete x
x = new int(12) //without deleting x, the address that holds value 10 becomes garbage.

因此,我正在考虑虽然该语言没有GC,为什么语言不会更新,使得非指向堆地址能够自己重新分配?因此,当重新分配地址时,可以用新的有效值替换垃圾内容,因此也可以省略垃圾收集器?

谢谢,如果我错了,请指出:)

1 个答案:

答案 0 :(得分:4)

如果没有某种参考跟踪,就没有办法实现这一点。

考虑以下代码修改:

int* y;
// somewhere else:
int* x = new int(10);
y = x;
x = new int(12);  // oops: y has now unexpected become invalid

换句话说,x指向的内存位置已复制到另一个指针y,然后x已重新分配。如果x的重新分配自动销毁了之前指向的数据,则y也将失效。

这将是不受欢迎的行为,因此您需要某种参考跟踪系统,以确保x指向的数据未被删除,除非 {{1}是该数据的唯一参考。

现在你刚刚彻底改造了(a type of) garbage collection

事实上,C ++确实有一种优雅的方式来实现这种类型的引用跟踪:通过RAII,或者我更喜欢称为"范围限制资源管理"。特别是对于内存位置的指针,您可以使用smart pointer class根据需要自动管理内存的分配和释放。