我知道两个“两次删除相同的内存”错误
指针寻址相同的动态分配对象。如果是delete
应用于其中一个指针,然后将对象的内存返回给
免费商店。如果我们随后删除第二个指针,那么free
商店可能已损坏。
但为什么这段代码不会导致运行时错误?
string *str_1 = new string;
auto str_2 = str_1;
*str_1 = "AAA";
cout<<*str_2<<endl;
delete str_1;
delete str_2; // No Error
// Prints AAA
答案 0 :(得分:13)
两次删除相同的内存是未定义的行为。任何事情都可能发生,包括什么。它可以是例如在某个时候导致崩溃。
答案 1 :(得分:2)
我在g ++ 4.9.1中编译了这个程序,它给了我一个运行时错误:
*** Error in `./t': free(): invalid pointer: 0xbfa8c9d4 ***
你正试图释放已经被释放的东西。因此,错误。
答案 2 :(得分:1)
我尝试在Visual Studio中执行此操作。有两种情况:
1)
delete p;
delete p;
这会正确编译但在运行程序时会导致调试断言失败,因为您正在尝试删除已删除但不再属于您的内存位置。
2)
delete p;
p = NULL;
delete p;
这正确编译并正常运行。没有错误。尝试打印p 删除之前和之后。
答案 3 :(得分:0)
在第二个删除命令之后未定义程序的行为,因此您不知道将在终端中发生和打印哪个错误。
答案 4 :(得分:0)
如果在Visual Studio调试模式下编译程序,则第一次删除应将内存设置为0xFEEEFEEE(请参阅此question) - 但是您的进程仍可访问该地址,因此不太可能导致异常。在BoundsChecker或Purify等产品中进行链接我相信会检查这些字节模式,以便检测已删除内存的访问。