我已经读过这个问题并回答:malloc()和free()如何工作?
一位朋友问我怎样才能确定免费工作.我回答说,如果它不起作用,那么操作系统可能会崩溃,并且它不会再那么重要了.
但我对这个问题答案的本质更感兴趣.一旦我释放了记忆,我怎么能确定它已被释放?我只是假设它吗? 这是一个纯粹的理论问题,背后没有实际的代码,而且大多数时候考虑我决定"好吧无论如何都没关系",但我对这个答案感到不安.
例如,如果内存是一个问题,我想确保在免费调用后释放一个大型结构,否则我会尝试再次清理,有没有办法做到这一点?
编辑:对于那些说明我的问题在这里回答的人:C中的函数free()对我不起作用
答案提供那里只是说我"实际上无法测试是否free()
有效".我试图理解为什么不能这样做.免费背后的本质是什么?
编辑2:在阅读完答案之后,似乎我接受了我给朋友的答案,即"它只是有效".
Malloc 从进程的称为堆的虚拟内存区域之一分配内存。堆的初始大小是多少(在执行开始之后和任何 malloc 调用之前)?比如说,如果堆从 X 虚拟地址开始并以 Y 虚拟地址结束,我想知道 X 和 Y 之间的区别。
我已阅读之前提出的重复问题的答案。
写的答案都是在虚拟地址的上下文中,但我想知道物理页是如何分配的。我不确定,但我认为这个初始大小(XY)在操作系统中不会有相应的页表条目。如果我错了,请纠正我。
现在,假设有一个分配(和使用)10 字节内存的请求,将分配一个新页面。那么,所有进一步的内存请求都会从此页面得到满足,还是每次分配新页面时都会得到满足?谁来决定这个?
当内存被释放(使用 free())时,那么什么时候这个分配的物理页将被释放并标记为可用?据我所知,虚拟地址和物理页不会立即释放,因为释放的内存量可能会非常少。那么什么时候物理地址和虚拟地址对应的关联会终止呢?
如果我的问题听起来很奇怪,我很抱歉。我只是一个新手,试图了解内部原理。
Helo,我无法成功在哈希中删除键后如何释放内存.当我从Hash中删除密钥时,内存不会被释放,也不会在GC.start
手动调用之后.当从Hash中删除密钥并且这些对象在某处泄漏时,这种预期行为或GC是否不释放内存?如何删除Ruby中的Hash键并在内存中取消分配?
例:
irb(main):001:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 4748
irb(main):002:0> a = {}
=> {}
irb(main):003:0> 1000000.times{|i| a[i] = "test #{i}"}
=> 1000000
irb(main):004:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140340
irb(main):005:0> 1000000.times{|i| a.delete(i)}
=> 1000000
irb(main):006:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 140364
irb(main):007:0> GC.start
=> nil
irb(main):008:0> `ps -o rss= -p #{Process.pid}`.to_i
=> 127076
Run Code Online (Sandbox Code Playgroud)
PS:我使用ruby 1.8.7.我也试过ruby 1.9.2,但并不是更好.
当OS将进程加载到内存中时,它会将堆栈指针初始化为虚拟地址,它决定堆栈应该进入进程的虚拟地址空间,程序代码使用该寄存器来知道堆栈变量的位置.我的问题是malloc()如何知道堆从哪个虚拟地址开始?堆是否总是存在于数据段的末尾,如果是这样,malloc()如何知道它在哪里?或者它甚至是一个连续的内存区域,还是只是随机穿插在数据部分中的其他全局变量?
考虑使用malloc()在碎片堆中分配x个字节的内存.假设堆有多个大小大于x字节的连续位置.
哪个是最好的(导致最少的堆浪费)启发式选择以下位置?
我的直觉是比x字节大的最小位置.我不确定哪种是最好的.
不,这不是任何转让问题.我正在读这个怎么做malloc()和free()工作?这看起来像是一个很好的跟进问题.
algorithm malloc operating-system memory-management heuristics
还有的malloc /自由和新的一个很好的比较/删除这里,好解释如何malloc()和free()的工作在这里.显然,我们不会混用它们 - 免费使用new或使用malloc删除.
我们可以看到许多开源项目,有许多贡献者,使用这两种机制,同时尊重上述"无混合"规则.通常,在一个文件中只有一种方式(一个作者,一个偏好).我已经分叉了这样一个项目,我正在使用new/delete添加一些功能.但我遇到了一些奇怪的记忆腐败.当然,我可能对他们负责,但.....
这让我想问一些"天真"的问题:
我可以在同一个编译单元(*.o)中同时使用malloc/free和new/delete机制 - 当然,尊重"无混合"规则?
我可以交错两种机制,就像在这段代码中一样吗?
int *a = (int *) malloc (1000 * sizeof int);
int *b = new int[1000];
// some code
free a;
delete[] b;
Run Code Online (Sandbox Code Playgroud)我有一个关于heap
和的简单问题malloc
:
当我们使用malloc
如下方式分配一些内存空间时:
int *p;
p = (int*) malloc (10*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
它实际上在堆中分配了10个单词.但是,我的问题是:
实际使用的内存空间真的是10个字吗?
或者还有其他额外的空间来存储内存大小的值?
或者,甚至,因为堆被构造为链接列表,是否有其他内存空间用于存储指向堆中列表的下一个节点的地址?
我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?
在免费列表中每个块的开头是否有一种校验和?就像是:
if((*ptr) == 'CHECKSUM'))
free
else
do something undefined
Run Code Online (Sandbox Code Playgroud) 按照我的理解,
free() 用于释放我们之前使用 malloc 分配的内存。
在下面的代码片段中,我释放了分配的内存。但是即使在释放后我也能够访问指针?怎么可能?
免费在内部如何运作?
#include<iostream>
using namespace std;
int main()
{
int *p=(int *)malloc(sizeof(int));
*p=17;
free(p);
*p=*p+1;
printf("\n After freeing memory :: %d ",*p );
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我试图从函数返回一个动态声明的数组; 到目前为止,我返回一个结构来保存指向malloc()
为数组分配的内存块的指针和一个整数来存储数组的长度.
这让我很奇怪; C编译器(或其他)如何处理程序中声明的自动数组? 例如.
main()
{
//delcare an array holding 3 elements
int array[] = {1,2,3};
/*variable to hold length of array
*size of array / size of 1st element in the array == length of the array
*this will == 3
*/
int array_Length = (sizeof(array))/(sizeof(*array));
//call malloc for a block of memory to hold 3 integers(worth of memory)
int* ptr = malloc(3*(sizeof(int)));
/*not exactly sure what this formula means when using …
Run Code Online (Sandbox Code Playgroud) c ×7
malloc ×7
free ×4
c++ ×2
heap ×2
pointers ×2
algorithm ×1
arrays ×1
hash ×1
heuristics ×1
linux-kernel ×1
memory ×1
memory-leaks ×1
new-operator ×1
ruby ×1
sizeof ×1