3

我很确定这是一个基本问题,但我在任何地方都找不到答案(可能是因为搜索词错误)。

以下代码是否会造成内存泄漏?

int * ptr= new int(15);
ptr= new int(25);

new在第二次调用同一指针上的运算符之前,我是否必须删除第一个指针?

4

4 回答 4

5

是的,你正在重写ptr另一个调用new. 因此第一个指针丢失。

如果您想重新使用相同的变量ptr,那么只需delete使用第一个指针并再次安全地使用它。

于 2012-05-15T18:42:41.523 回答
5

以下代码是否会造成内存泄漏?

是的。

在第二次在同一个指针上调用 new 运算符之前,我是否必须删除第一个指针?

是的,您应该在丢失对它的所有引用并且不再可以释放它之前delete分配任何东西。new

于 2012-05-15T18:42:55.297 回答
5

实际上只是为了澄清一点。
New将为您提供堆中的“随机”指针,唯一的保证是您可以将请求的字节数放入指针指向的内存块中。

考虑以下:

int *x = new int;指针x现在指向0x12345678,并且那里有一个整数的位置,获得这个整数的唯一方法是使用存储在指针中的地址x

现在假设你再次调用 new。0x12345678x = new int; 处的整数房间为您保持“保留”,但您的指针现在指向其他地方,例如0x87654321,那里有一个新整数的新“点”,指向前一个的指针永远丢失,因为您的指针没有long 指向堆的原始部分。

这个问题的解决方案是调用delete指针,它不会触及指针x本身,它只会从指针恰好指向的堆中释放内存。(作为直接结果,它x本身会改变,但只是因为new会给它赋值......)

new现在您可以再次自由调用。

(编辑)是的,new确实为您调用了构造函数,但这并不是真正的重点。

于 2012-05-15T18:48:48.503 回答
4

是的,是的。每次使用new,都必须使用delete,它是对等的。

于 2012-05-15T18:42:23.850 回答