使用释放的内存可能真的崩溃?

mpr*_*net 2 c memory memory-management

以下代码访问不再分配的内存.

#include <stdio.h>
int main()
{
        int * ptr = new int(5);
        delete ptr;
        return *ptr;
}
Run Code Online (Sandbox Code Playgroud)

指针访问内存不再分配,但直到内存可访问它才会返回一个值.我想知道,实际上程序是否可能因分段违规信号而崩溃.

编辑:我在一个循环中运行超过100000次没有崩溃,这并不意味着它永远不会崩溃,只是它没有在这些期间崩溃100000次.也许用这么简单的程序是不可能的?

jua*_*nza 6

我想知道是否有可能这会使程序崩溃,发生分段违规信号或类似的事情.

是.取消引用已删除的指针是未定义的行为.可能发生的一件事就是崩溃.另一个是该程序可以毫无问题地默默退出.

  • 第二个('默默退出')比段错误更糟糕 - 它隐藏了问题 (5认同)
  • @Koushik:编译器原则上可以找到*some*UB(包括这个例子); 但有些只能在运​​行时检测到,如果有的话.稍微修改一下,存储悬空指针然后再访问它,静态分析无法检测到. (4认同)