c++删除指针两次

C++ delete pointer twice

本文关键字:两次 删除 指针 c++      更新时间:2023-10-16

我知道"删除相同的内存两次"错误可能发生在两个指针指向同一个动态分配的对象。如果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

两次删除相同的内存是未定义的行为。任何事都可能发生,包括什么也不发生。例如,它可能在以后的某个时间导致崩溃。

我在g++ 4.9.1中编译了这个程序,它给了我一个运行时错误:

*** Error in `./t': free(): invalid pointer: 0xbfa8c9d4 ***

您正在尝试释放已经被释放的东西。因此,出现了错误

我尝试在Visual Studio中这样做。有两种情况:

1)

delete p;
delete p;

这个编译正确,但是当你运行程序时给出调试断言失败,因为你试图删除已经删除并且不再属于你的内存位置。

2)

delete p;
p = NULL;
delete p;

正确编译并正常运行。没有错误。尝试打印p

程序的行为在第二个删除命令之后没有定义,因此您无法真正知道哪个错误将发生并打印到您的终端。

如果你在Visual Studio调试模式下编译你的程序,那么第一次删除应该将内存设置为0xFEEEFEEE(参见这个问题)-但是该地址仍然可以被你的进程访问,所以不太可能导致异常。链接一个像BoundsChecker或Purify这样的产品,我相信它会检查这些字节模式,这样它就可以检测到删除内存的访问。