繁体   English   中英

分配两次 - 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个怎么办?? 这会是内存泄漏还是什么?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM