我编写了一个代码来测试,以测试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 dio.h>
#include
最佳答案
malloc()返回的内存未初始化,这意味着它可能是任何内容.它可能是零,也可能不是; ‘not initialized’意味着它可以是任何东西(包括零).要获得保证归零页面,请使用calloc().
您看到归零页面(无论如何在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