[英]Allocating twice - c++
5个怎么办?? 这会是内存泄漏还是什么?
是的! 第二个new
将覆盖ptr
,您将需要旧地址来删除第一个分配。 除非你将ptr
保存在另一个变量中,或者在第二个new
之前删除它,或者第二个指针使用另一个变量名,否则你将无法知道第一个内存块的地址,你将无法释放它。 那就是内存泄漏。
顺便说一句,欢迎来到 SO
代码.cpp:
int main()
{
int *ptr = new int;
*ptr=5;
ptr=new int; //again, different memory location
*ptr=25;
delete ptr;
return 0;
}
上面的代码导致了第一个 new 分配的内存泄漏。
编译代码如下:
g++ -fsanitize=leak code.cpp -o code
./code
输出(ubuntu budgie x64):
=================================================================
==15281==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x7fa9f020e3d1 in operator new(unsigned long) (/lib/x86_64-linux-gnu/liblsan.so.0+0x103d1)
#1 0x5555ec6d217e in main (/home/srilakshmikanthanp/Documents/test/code+0x117e)
#2 0x7fa9f00330b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
SUMMARY: LeakSanitizer: 4 byte(s) leaked in 1 allocation(s).
谢谢。
是的,会有内存泄漏,即使这样做,您丢失指针地址的操作也会导致泄漏:
myPointer = new int;
myPointer = NULL; //leaked memory, no pointer to above int
delete myPointer; //no point at all
请注意,我们可以在 NULL 上使用 delete 它不会做任何事情。
您可以查看: 智能指针,它以一点开销为您处理这些事情。
在用另一个对象的地址重新分配ptr
之后
ptr = new int; //again, different memory location
您不再可以访问第一个对象及其地址。 你将无法删除它。 这就是内存泄漏!
你可以从网上购物的角度考虑这一点。 当您致电new
,您下订单(用于记忆)。 当您调用delete
,您将退回项目(内存)以获得退款。 目标是以你开始的东西结束; 一切都应该退还退款。
如果您退货的数量超过订单数量,商店将向您收取欺诈费用(可能导致崩溃)。 这是你在其他问题中读到的问题。
如果您订购的比退货的多,东西(记忆)就会在您的家(流程)中累积。 这对商店没有问题,因为它有利于业务。 直到您的房屋溢出,当局才会介入。 但是,当您尝试在垃圾中导航时会遇到问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.