我很确定这是一个基本问题,但我无法在任何地方找到答案(可能是因为搜索词错误)。
以下代码是否会造成内存泄漏?
int * ptr= new int(15);
ptr= new int(25);
在对同一指针第二次调用 new
运算符之前,是否必须删除第一个指针?
最佳答案
实际上只是为了把事情弄清楚一点。
New
会给你一个来自堆的“随机”指针,唯一的保证是你可以将你请求的字节数放入你的指针指向的内存块中。
考虑以下几点:
int *x = new int;
指针 x
现在指向 0x12345678,那里有一个整数的位置,而且唯一获取此整数的方法是使用存储在指针 x
中的地址。
现在假设您再次调用 new。 x = new int;
0x12345678 的整数空间为您保留“保留”,但您的指针现在指向其他地方,例如指向 0x87654321为新整数创建一个新的“点”,并且指向前一个的指针将永远丢失,因为您的指针不再指向堆的原始部分。
这个问题的解决方案是在指针上调用 delete
,这不会触及指针 x
本身,它只会从指针释放的堆中释放内存恰好指向。 (作为其直接结果,x
本身会发生变化,但这只是因为 new
会将值分配给它...)
现在您可以再次自由调用 new
。
(edit) 是的,new
确实会为您调用构造函数,但这不是这里的重点。
关于C++ 单指针上的多个 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606870/