分配两次 - C++
Allocating twice - c++
我看到很多类似关于删除两次的问题,但是分配两次只删除一次会发生什么?旧版本不是仍然存在吗?程序是如何编译的?
难道我也不必发布新的吗,因为根据 d'tor 它只被调用一次。
例如:
int main()
{
int *ptr = new int;
*ptr=5;
ptr=new int; //again, different memory location
*ptr=25;
delete ptr;
return 0;
}
5 是什么??会不会是内存泄漏之类的?
是的,会出现内存泄漏,即使在丢失指针地址的地方做这样的事情也会导致泄漏:
myPointer = new int;
myPointer = NULL; //leaked memory, no pointer to above int
delete myPointer; //no point at all
请注意,我们可以在 NULL 上使用 delete 它不会做任何事情。
您可以查看:Smart Pointers 它会为您处理这些事情,但需要一些开销。
用另一个对象的地址重新分配 ptr
之后
ptr = new int; //again, different memory location
您无法再访问第一个对象及其地址。
您将无法删除它。那就是内存泄漏!
what with the 5?? it will be a memory leak or something?
是的!第二个 new
将覆盖 ptr
,您将需要旧地址来删除第一个分配。除非你把它 ptr
保存在另一个变量中,或者在第二个 new
之前删除它,或者第二个指针使用另一个变量名,你将无法知道第一个内存块的地址,你将无法释放它。那是内存泄漏。
顺便说一下,欢迎来到 SO
code.cpp:
int main()
{
int *ptr = new int;
*ptr=5;
ptr=new int; //again, different memory location
*ptr=25;
delete ptr;
return 0;
}
上述代码导致第一个new分配的内存泄漏。
compile the code like:
g++ -fsanitize=leak code.cpp -o code
./code
output (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).
谢谢。
您可以从在线购物的角度来考虑这一点。当您调用new
时,您下了订单(用于记忆)。当您致电 delete
时,您 return 要求退款的商品(内存)。目标是以开始的事情结束;所有东西都应该return退款。
如果您 return 多于您订购的数量,商店将合理地向您收取欺诈费用(可能崩溃)。这是您在其他问题中读到的问题。
如果你订购的比你多 return,东西(内存)就会堆积在你的家里(过程)。这对商店没有问题,因为它对业务有利。在您的房屋溢出之前,当局不会介入。但是,当您尝试在垃圾中导航时会遇到问题。
我看到很多类似关于删除两次的问题,但是分配两次只删除一次会发生什么?旧版本不是仍然存在吗?程序是如何编译的?
难道我也不必发布新的吗,因为根据 d'tor 它只被调用一次。
例如:
int main()
{
int *ptr = new int;
*ptr=5;
ptr=new int; //again, different memory location
*ptr=25;
delete ptr;
return 0;
}
5 是什么??会不会是内存泄漏之类的?
是的,会出现内存泄漏,即使在丢失指针地址的地方做这样的事情也会导致泄漏:
myPointer = new int;
myPointer = NULL; //leaked memory, no pointer to above int
delete myPointer; //no point at all
请注意,我们可以在 NULL 上使用 delete 它不会做任何事情。
您可以查看:Smart Pointers 它会为您处理这些事情,但需要一些开销。
用另一个对象的地址重新分配 ptr
之后
ptr = new int; //again, different memory location
您无法再访问第一个对象及其地址。 您将无法删除它。那就是内存泄漏!
what with the 5?? it will be a memory leak or something?
是的!第二个 new
将覆盖 ptr
,您将需要旧地址来删除第一个分配。除非你把它 ptr
保存在另一个变量中,或者在第二个 new
之前删除它,或者第二个指针使用另一个变量名,你将无法知道第一个内存块的地址,你将无法释放它。那是内存泄漏。
顺便说一下,欢迎来到 SO
code.cpp:
int main()
{
int *ptr = new int;
*ptr=5;
ptr=new int; //again, different memory location
*ptr=25;
delete ptr;
return 0;
}
上述代码导致第一个new分配的内存泄漏。
compile the code like:
g++ -fsanitize=leak code.cpp -o code
./code
output (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).
谢谢。
您可以从在线购物的角度来考虑这一点。当您调用new
时,您下了订单(用于记忆)。当您致电 delete
时,您 return 要求退款的商品(内存)。目标是以开始的事情结束;所有东西都应该return退款。
如果您 return 多于您订购的数量,商店将合理地向您收取欺诈费用(可能崩溃)。这是您在其他问题中读到的问题。
如果你订购的比你多 return,东西(内存)就会堆积在你的家里(过程)。这对商店没有问题,因为它对业务有利。在您的房屋溢出之前,当局不会介入。但是,当您尝试在垃圾中导航时会遇到问题。