C++单指针上有多个新的

Fra*_*ank 3 c++ memory-leaks

我很确定这是一个基本问题,但我无法在任何地方找到答案(可能是因为错误的搜索条件).

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

int * ptr= new int(15);
ptr= new int(25);
Run Code Online (Sandbox Code Playgroud)

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

P.P*_*.P. 5

是的,你正在ptr用另一个电话来覆盖new.因此第一个指针丢失了.

如果你想重复使用同一个变量,ptr那么只delete需要第一个指针,然后再安全地使用它.


K-b*_*llo 5

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

是的.

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

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


Sca*_*nth 5

只是为了清楚一点.
New将为您提供一个来自堆的"随机"指针,唯一的保证是您可以将所请求的字节数量放入指针所指向的内存块中.

考虑以下:

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

现在假设你再次打电话给新人.0x12345678x = new int; 的整数空间对你保持"保留"但你的指针现在指向其他位置,比如说0x87654321,其中有一个新的整数新的"点",并且指向前一个的指针永远丢失,因为你的指针没有较长的点指向堆的原始部分.

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

现在你可以new再次自由呼叫.

(编辑)是的,new确实为你调用了构造函数,但这不是真的.