什么机制检测未分配内存的访问?

时间:2011-12-09 21:50:22

标签: objective-c c memory-management

我会不时出现如下错误:

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

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

我已经超出了已分配区域的末尾,因此我在运行时获得了一个EXC_BAD_ACCESS信号。我的问题是:这是如何被发现的?看起来这只会默默地返回垃圾,因为我只关闭了一个字节,而不是整页。系统的哪个部分阻止我只返回x + 2000处的垃圾字节?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

也许你很幸运,因为你使用2000作为一个大小。根据{{​​1}}的大小,总大小可以被int32整除,因此很有可能它的结尾真正终止了“真正的”分配。尝试使用奇数个字节(最好使用64数组)并查看您的系统是否仍然检测到它。

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