Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc分配相同的内存块_C_Memory Management_Malloc - Fatal编程技术网

Malloc分配相同的内存块

Malloc分配相同的内存块,c,memory-management,malloc,C,Memory Management,Malloc,我使用C库malloc分配8MB内存,使用该内存后,我使用free释放8MB内存 但当我再次使用malloc分配8MB内存时,它分配的位置与之前分配的位置相同 如何避免这个问题,为什么会发生这种情况 编辑:我正在实现一个测试主内存的工具,如果malloc分配了相同的内存块,就不可能检查整个内存这本身不是问题,是设计的。由于性能原因,malloc的典型实现将回收内存块。在任何情况下,由于malloc从有限的值池返回地址,因此它无法保证不回收块 阻止malloc返回以前返回的块的唯一可靠方法是停止释

我使用C库
malloc
分配
8MB
内存,使用该内存后,我使用
free
释放
8MB
内存

但当我再次使用
malloc
分配
8MB
内存时,它分配的位置与之前分配的位置相同

如何避免这个问题,为什么会发生这种情况


编辑:我正在实现一个测试主内存的工具,如果
malloc
分配了相同的内存块,就不可能检查整个内存这本身不是问题,是设计的。由于性能原因,malloc的典型实现将回收内存块。在任何情况下,由于malloc从有限的值池返回地址,因此它无法保证不回收块

阻止malloc返回以前返回的块的唯一可靠方法是停止释放它们。当然,这不是很实际

我正在实现一个测试主内存的工具。如果malloc分配相同的内存块,则无法检查整个内存

测试主内存的工具不能用malloc实现,也不能用任何用户模式程序实现。现代操作系统不允许您访问物理内存。相反,它们提供了一个虚拟化的内存视图。程序中的地址不是物理地址,而是虚拟地址。测试物理内存需要以比用户模式程序低得多的级别进行

这应该对你有帮助 为了防止这种情况,请使用malloc/calloc分配几个字节,然后释放较大的内存块。 顺便说一句,获取相同的内存地址不是错误的行为


您可能需要调用system()从代码中运行一些linux命令(提供详细的内存管理选项)。无法使用malloc/free完成/测试主内存管理,它们仅限于在程序运行时对分配给程序的内存进行操作。

然后会有大量未使用的内存orry,你的意思是什么?只有当
malloc
分配的内存被释放后,它才能被其他程序使用。我仍然不理解这些注释。@Nikhilendra-你最后的注释表明你不理解虚拟内存。操作系统在任何时候都可以自由地将进程的内存交换到磁盘,从而释放其他进程可以使用的已占用物理内存。即使不是,每个进程都使用相同的虚拟地址空间。是什么让你认为这是一个问题?是什么让你认为这是一个问题?您是否阅读了
免费
的文档?请解释这是一个问题的原因。如果你释放了内存,你就不应该抓住任何指向它的指针。这是行不通的。虚拟内存分页使使用用户空间应用程序测试系统内存变得不可行-无法确保您正在测试所有内存。(事实上,一些物理内存将由内核连接,因此永远不会被应用程序测试。)在具有虚拟内存的操作系统中,即使malloc返回的地址不同,也没有理由认为它将被放置在物理内存中的不同地址中。