我很确定这是一个基本问题,但我在任何地方都找不到答案(可能是因为搜索词错误)。
以下代码是否会造成内存泄漏?
int * ptr= new int(15);
ptr= new int(25);
new
在第二次调用同一指针上的运算符之前,我是否必须删除第一个指针?
我很确定这是一个基本问题,但我在任何地方都找不到答案(可能是因为搜索词错误)。
以下代码是否会造成内存泄漏?
int * ptr= new int(15);
ptr= new int(25);
new
在第二次调用同一指针上的运算符之前,我是否必须删除第一个指针?
是的,你正在重写ptr
另一个调用new
. 因此第一个指针丢失。
如果您想重新使用相同的变量ptr
,那么只需delete
使用第一个指针并再次安全地使用它。
以下代码是否会造成内存泄漏?
是的。
在第二次在同一个指针上调用 new 运算符之前,我是否必须删除第一个指针?
是的,您应该在丢失对它的所有引用并且不再可以释放它之前delete
分配任何东西。new
实际上只是为了澄清一点。
New
将为您提供堆中的“随机”指针,唯一的保证是您可以将请求的字节数放入指针指向的内存块中。
考虑以下:
int *x = new int;
指针x
现在指向0x12345678,并且那里有一个整数的位置,获得这个整数的唯一方法是使用存储在指针中的地址x
。
现在假设你再次调用 new。0x12345678x = new int;
处的整数房间为您保持“保留”,但您的指针现在指向其他地方,例如0x87654321,那里有一个新整数的新“点”,指向前一个的指针永远丢失,因为您的指针没有long 指向堆的原始部分。
这个问题的解决方案是调用delete
指针,它不会触及指针x
本身,它只会从指针恰好指向的堆中释放内存。(作为直接结果,它x
本身会改变,但只是因为new
会给它赋值......)
new
现在您可以再次自由调用。
(编辑)是的,new
确实为您调用了构造函数,但这并不是真正的重点。
是的,是的。每次使用new
,都必须使用delete
,它是对等的。