C ++删除指针两次

时间:2014-08-05 11:51:01

标签: c++ pointers

我知道两个“两次删除相同的内存”错误 指针寻址相同的动态分配对象。如果是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

5 个答案:

答案 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等产品中进行链接我相信会检查这些字节模式,以便检测已删除内存的访问。