为什么删除指针两次会导致崩溃
Why deleteing a pointer twice will cause crash?
可能重复:
为什么两次调用时Free崩溃
我只想知道当我们删除已经删除的指针时到底发生了什么,是什么原因导致了崩溃?
很难准确预测会发生什么——这在一定程度上取决于编译器,在很大程度上依赖于标准库。官方称,这只是未定义的行为,所以几乎任何事情都可能发生。
最常见的情况是垃圾堆会被丢弃。它可能不会检查删除的内容是否有效,因此当它在同一地址获得两个块时,它可能(例如(仍然将它们视为两个单独的块,因此当您稍后分配内存时,您可能会两次获得相同的内存块。在其他一些情况下,它可能(例如(只是补充了一点,说明该内存块是否正在使用中,所以当你第二次删除它时,你实际上会将其标记为再次使用,这样内存就再也无法分配了,而你基本上只是创建了一个泄漏。
如果你买了一辆车,你能卖两次吗?不对,因为第二次你不再是它的所有者。当你第一次删除指针时,你就放弃了所有权,内存将返回到空闲池,准备再次分配。如果你第二次删除它,那么现在任何其他程序都可能使用该内存,当他们试图访问它时,它就会崩溃。希望这对有帮助
确实如此。
释放你不拥有的内存是违法的(如果你之前释放了一块内存,那么你就不再拥有它(。
因为这样做是非法的,所以内部算法不会浪费时间,每次你试图释放一些东西时都会仔细检查内存所有权,假设你足够明智,不这样做。
当然,这样做的副作用是你会破坏你的记忆,让事情变得一团糟。
对真正具体的例子的分析远远超出了Stack Overflow的范围,甚至超出了理智的范围。不过,这个对可能重复的问题的回答做得很好。
为什么free()
每次都不能检查它的"记录"?因为C++的设计原则是不做它不需要做的事情。如果你是一个理智的程序员,你不会在同一块内存上调用free()
两次,那么你为什么要让你的程序在毫无意义的检查上浪费时间和资源呢?你不会的。语言的原则(实际上还有常识(规定这些检查是而不是自动执行的
旁注—我对"非法"一词的使用有点慷慨。在C++的范围内,它只是"未定义的行为"。在实用性的范围内,这也可能是同样的事情
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- C 如何使功能崩溃两次(32位机器)
- 静态 c++ 对象中的 JNI 环境指针并调用连续两次使用字符串参数的 Java 函数会使 JVM 崩溃
- Qt 当列表小部件项被单击两次时崩溃
- 为什么我的程序不崩溃,如果析构函数被调用两次
- 调用两次的析构函数会导致崩溃
- 为什么删除指针两次会导致崩溃