C++ - 使用"new"在堆上分配内存

Sim*_*ity 7 c++ heap new-operator memory-address dynamic-memory-allocation

如果我有以下声明:

int *x = new int;

在这种情况下,我已动态地在堆上分配内存.换句话说,我现在有reserved一个int对象的内存地址.

在那之后说我做了以下:

delete x;

这意味着我freed up在堆上的内存地址.

在那之后说我再次做了以下事情:

int *x = new int;

x指向它指出,在堆旧的内存地址被删除之前?

如果我这样做过delete:

x = NULL;

然后,这样做:

int *x = new int;

x指向堆上AA内存地址较旧的?

谢谢.

Jer*_*fin 10

在第一种情况下,您可能会再次获得相同的内存块,但并不确定.

在第二种情况下,由于您没有释放内存,因此几乎可以确定您将在不同的地址获得不同的内存块.有C++的垃圾收集器.如果您使用其中之一,可以想象垃圾收集器将在您将指针清空之间运行(因此您不再能够访问先前分配的内存块)并再次请求分配.在这种情况下,您可以再次获得相同的内存块.当然,没有垃圾收集器,你只是泄漏内存,所以在任何情况下你都无法做到这一点.


Joh*_*ren 1

不,没有这样的保证。这完全取决于用于满足您的内存请求的分配器。然而,C++ 是一个强大的野兽,让我们重写 new 运算符。您可以构建一个自定义分配器(内存管理),它以某种方式提供内存,这有时非常有用。