分配两次 - 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,东西(内存)就会堆积在你的家里(过程)。这对商店没有问题,因为它对业务有利。在您的房屋溢出之前,当局不会介入。但是,当您尝试在垃圾中导航时会遇到问题。