【发布时间】:2025-12-03 21:25:01
【问题描述】:
我多次听说悬空指针取消引用会导致程序崩溃,但我不知道为什么。谁能给我解释一下?
据我了解,在 C/C++ 中,当我们通过指针 p 释放内存对象 o 后,p 变为指向语义上无效的内存地址 addr 的悬空指针。也许稍后addr 会被内存分配器重新分配给另一个内存对象。不管这种情况发生与否,操作系统都会认为addr仍然是一个合法的访问地址,因为内存分配器只向操作系统请求内存,而不会将内存还给操作系统。所以根本不应该有崩溃。谁能告诉我我的理解哪里错了?
【问题讨论】:
-
您不应该抱怨崩溃。如果程序在这些条件下不崩溃,情况会更糟。
-
如果释放的内存随后被分配给包含指针的对象怎么办?现在这些指针将被(基本上)随机数据覆盖。下一次那些被覆盖的指针被取消引用......噗!
-
@Galik,我知道它可能会因为数据不一致而间接导致程序崩溃。但是我想知道当悬空指针被取消引用时程序如何立即崩溃,机制是什么?
-
根据我的经验,程序通常不会在访问已释放的已分配内存后立即崩溃。但是,理论上,虚拟内存表中内存映射到的页面可以返回给操作系统,并在硬件寄存器中标记为非法,从而导致硬件异常。
-
@Galik,您是否建议只有将内存返回给操作系统时才会发生崩溃?如果我们使用不返回内存的分配器,那么在 use-after-free 站点不会立即崩溃,对吧?
标签: c++ c pointers memory memory-management