查看释放的内存会导致访问冲突吗?

Syd*_*ius 3 c memory access-violation

可以访问(只读)释放的内存会导致访问冲突,如果是,在什么情况下?

AnT*_*AnT 11

是的,它可以."访问冲突"("分段错误"等)是当进程尝试访问(甚至只是为了读取)操作系统已知为"空","释放"或"已释放"的内存时,OS /硬件通常生成的响应因其他原因无法进入.这里的关键时刻是OS /硬件必须知道内存是空闲的.C标准库的内存管理功能不一定会将'free'd内存返回给OS.他们可能(并将会)保留它以供将来分配.因此,在某些情况下,访问'free'd内存不会导致"访问冲突",因为从操作系统/硬件的角度来看,这个内存还没有被真正释放.但是,在某些时候,标准库可能会决定将收集的空闲内存返回给操作系统,之后尝试访问该内存通常会导致"访问冲突".


GMa*_*ckG 7

你问"可以"而不是"会",所以你的回答是肯定的.指向不属于您的程序的内存是未定义的行为,因此可能发生任何事情.

会吗?要看.这是特定于操作系统的.你可能能够逃脱它,但显然你不能依赖它.尝试取消引用它可能会导致异常,因为操作系统已经为自己的用途回收了内存.(再次,OS特定).

  • 实际上,我很确定即使指向它也是不确定的.至少对于数组,你可以指向0到n + 1(也就是说,一个包含8个元素的数组可以访问0到7,加上8也是如此,尽管取消引用它是未定义的). (4认同)
  • 对于某些人来说,这听起来可能过于迂腐,但在C/C++中,仅仅形成*无效指针的行为理论上会导致未定义的行为.无需访问尝试. (4认同)