[英]What mechanism detects accesses of unallocated memory?
有时,我会有一个像以下一样的错误:
unsigned int* x = calloc(2000, sizeof(unsigned int));
printf("%d", x[2000]);
我已超出分配区域的末尾,因此我在运行时获得了EXC_BAD_ACCESS信号。 我的问题是:这是如何被发现的? 看起来这只会默默地返回垃圾,因为我只关闭了一个字节,而不是整页。 系统的哪个部分阻止我在x + 2000
处返回垃圾字节?
内存系统在其内存字段的开头和结尾都有标记值,超出了分配的字节数。 释放内存时,它会检查这些值是否完好无损。 如果没有,它告诉你。
也许你只是幸运,因为你使用2000
作为一个大小。 根据int
的大小,总大小可以被32
或64
整除,因此很有可能它的结尾真正终止了“真正的”分配。 尝试使用奇数个字节(最好使用char
数组)并查看您的系统是否仍然检测到它。
无论如何,你不应该依赖这种方式来发现这些错误。 始终使用valgrind或类似方法检查您的内存访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.