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