【问题标题】: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 的大小,总大小可以被32 或64 整除,因此它的结尾真正终止“真实”分配的可能性很高。尝试使用一些奇数字节(最好使用 char 数组),看看您的系统是否仍然检测到它。
在任何情况下,您都不应该依赖以这种方式找到这些错误。始终使用 valgrind 或类似工具来检查您的内存访问。