c++删除指针两次
C++ delete pointer twice
我知道"删除相同的内存两次"错误可能发生在两个指针指向同一个动态分配的对象。如果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这样的产品,我相信它会检查这些字节模式,这样它就可以检测到删除内存的访问。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 两次删除链表有什么区别?
- 有什么方法可以通过删除表达式安全地处理两次释放内存?
- 在 for 循环(链表)中删除两次后,变量不可用
- Qt - 堆栈上具有父级的 QObject 如何被删除两次?
- 删除对象两次
- C++-如果我使用映射,我的对象会被删除两次吗
- c++删除指针两次
- 重新分配变量,删除调用了两次(C++)
- 为什么当我删除两次相同的内存时没有错误?
- 为什么删除指针两次会导致崩溃