繁体   English   中英

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

[英]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的大小,总大小可以被3264整除,因此很有可能它的结尾真正终止了“真正的”分配。 尝试使用奇数个字节(最好使用char数组)并查看您的系统是否仍然检测到它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM