我编写了一个代码来测试,以测试Linux和Windows操作系统的内存管理.为了进一步测试,我继续检查malloc()返回的内存中存在哪些值.
返回的值都是0(零).我已经阅读了malloc的手册页,在Windows和Linux上都进行过检查,但是我无法找到这种行为的原因.根据联机帮助页
The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized.
要清除内存段,必须手动使用memset().
#include
也许我错过了什么.
该代码改编自here
编辑:问题已经回答here GCC特定输出.我相信Windows操作系统也会遵循相同的程序.
您看到归零页面(无论如何在Linux上)的原因是,如果应用程序请求新页面,这些页面将由操作系统归零(或者更确切地说,它们是固定页面的零写入时的复制写入图像,称为’全球零页’).但是,如果malloc()碰巧使用已经分配给应用程序的内存(此时已经被释放)(而不是扩展堆),您可能会看到非零数据.请注意,操作系统提供的页面归零是特定于操作系统的特征(主要用于安全性,因此一个进程最终不会发生碰巧有来自另一个进程的数据的页面),并且不是C标准强制要求的.
您要求get_free_page将页面归零source:表示’get_free_page()需要一个参数,一个优先级. …它需要关闭free_page_list页面,更新mem_map,将页面归零并返回页面的物理地址. Here的另一篇文章解释得很好,也解释了为什么使用calloc()比malloc()memset()更好.
请注意,您没有将整个分配的块检查为零.你想要这样的东西(未经测试):
int n;
char nonzero=0;
char *buffer=malloc(sizeof(char)*chunk);
if(buffer==NULL){
return -1;
}
for (n = 0; n
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。