两次分配-C++

两次分配-C++,c++,new-operator,delete-operator,C++,New Operator,Delete Operator,我看到了很多关于删除两次的类似问题,但是当您分配两次并只删除一次时会发生什么?旧版本不是仍然存在吗?程序是如何编译的? 我不需要发布新的,因为根据d'tor,它只会被调用一次 例如: int main() { int *ptr = new int; *ptr=5; ptr=new int; //again, different memory location *ptr=25; delete ptr; return 0; } 那5个呢?

我看到了很多关于删除两次的类似问题,但是当您分配两次并只删除一次时会发生什么?旧版本不是仍然存在吗?程序是如何编译的? 我不需要发布新的,因为根据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,但它不会做任何事情

您可以查看:它会以少量开销为您处理这些事情。

是的,会出现内存泄漏,即使这样做,丢失指针地址也会导致泄漏:

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
您不再有权访问第一个对象及其地址。
您将无法删除它。这就是内存泄漏

使用另一个对象的地址重新分配ptr后

ptr = new int; //again, different memory location
您不再有权访问第一个对象及其地址。 您将无法删除它。这就是内存泄漏

那5个呢??是内存泄漏还是什么

对!!第二个新地址将覆盖ptr,您将需要旧地址来删除第一个分配。除非将ptr保存在另一个变量中,或在第二个新变量之前将其删除,或对第二个指针使用另一个变量名,否则无法知道第一个内存块的地址,也无法释放它。这是内存泄漏

顺便说一句,欢迎来到SO

那5个呢??是内存泄漏还是什么

对!!第二个新地址将覆盖ptr,您将需要旧地址来删除第一个分配。除非将ptr保存在另一个变量中,或在第二个新变量之前将其删除,或对第二个指针使用另一个变量名,否则无法知道第一个内存块的地址,也无法释放它。这是内存泄漏

顺便说一句,欢迎来到SO

code.cpp:

上述代码导致first new分配的内存泄漏

编译代码如下:

输出ubuntu budgie x64:

谢谢

code.cpp:

上述代码导致first new分配的内存泄漏

编译代码如下:

输出ubuntu budgie x64:


谢谢。

你可以从网上购物的角度来考虑这一点。当您调用new时,您会订购内存。当您调用delete时,您将返回项目内存以获得退款。目标是以你开始的东西结束;所有的东西都应该退票

如果您退货数量超过订单数量,商店将以欺诈罪起诉您,并可能导致崩溃。这就是你在其他问题中读到的问题


如果您订购的数量超过退货数量,则内存会在您的主进程中累积。这对商店没有任何问题,因为这对生意有好处。在你的房子被洪水淹没之前,当局不会介入。然而,当你试图在垃圾中导航时,你会遇到问题。

你可以从网上购物的角度来考虑这一点。当您调用new时,您会订购内存。当您调用delete时,您将返回项目内存以获得退款。目标是以你开始的东西结束;所有的东西都应该退票

如果您退货数量超过订单数量,商店将以欺诈罪起诉您,并可能导致崩溃。这就是你在其他问题中读到的问题


如果您订购的数量超过退货数量,则内存会在您的主进程中累积。这对商店没有任何问题,因为这对生意有好处。在你的房子被洪水淹没之前,当局不会介入。但是,当您尝试在垃圾中导航时会遇到问题。

是的,它会被泄漏。编译不会检查内存泄漏。代码是有效的。好的,我怎么能忽略这个内存泄漏?为什么编译器会给我警告呢?最好的方法是永远不要使用new关键字。现代C++有更好的动态分配内存的方法,你忽略了什么?编译器无法警告您,因为检测泄漏是一个无法确定的问题。但ValGRD可以在运行程序时检查漏洞。C++对你自己的代码中的bug有很小的帮助。众所周知,C++给了你每个机会去处理它,你有责任编写正确管理内存的代码。幸运的是,在现代C++中,容器和算法的正确使用几乎消除了分配和释放任何东西的需要。现代C++代码很少使用新的或删除的。是的,它会泄露。编译不会检查内存泄漏。代码
是有效的。好的,如何忽略此内存泄漏?为什么编译器会给我警告呢?最好的方法是永远不要使用new关键字。现代C++有更好的动态分配内存的方法,你忽略了什么?编译器无法警告您,因为检测泄漏是一个无法确定的问题。但ValGRD可以在运行程序时检查漏洞。C++对你自己的代码中的bug有很小的帮助。众所周知,C++给了你每个机会去处理它,你有责任编写正确管理内存的代码。幸运的是,在现代C++中,容器和算法的正确使用几乎消除了分配和释放任何东西的需要。现代C++代码很少使用新的或删除的。C++中的NULL被禁止。在C++中使用Null pTr.NULL。使用nullptr。
=================================================================
==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).