【问题标题】:What mechanism detects accesses of unallocated memory?什么机制检测未分配内存的访问?
【发布时间】:2011-12-09 21:50:22
【问题描述】:

有时,我会遇到如下错误:

unsigned int* x = calloc(2000, sizeof(unsigned int));

printf("%d", x[2000]);

我已经超出了分配区域的末尾,所以我在运行时收到了 EXC_BAD_ACCESS 信号。我的问题是:这是如何检测到的?看起来这只会默默地返回垃圾,因为我只偏离了一个字节,而不是整页。系统的哪个部分阻止我只返回 x + 2000 的垃圾字节?

【问题讨论】:

标签: objective-c c memory-management


【解决方案1】:

内存系统在其内存字段的开头和结尾都有标记值,超出了您分配的字节。当您释放内存时,它会检查这些值是否完好无损。如果没有,它会告诉你。

【讨论】:

    【解决方案2】:

    也许您只是幸运,因为您使用2000 作为大小。根据int 的大小,总大小可以被3264 整除,因此它的结尾真正终止“真实”分配的可能性很高。尝试使用一些奇数字节(最好使用 char 数组),看看您的系统是否仍然检测到它。

    在任何情况下,您都不应该依赖以这种方式找到这些错误。始终使用 valgrind 或类似工具来检查您的内存访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2012-08-24
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多