相关疑难解决方法(0)

检查是否免费工作

我已经读过这个问题并回答:malloc()和free()如何工作?

一位朋友问我怎样才能确定免费工作.我回答说,如果它不起作用,那么操作系统可能会崩溃,并且它不会再那么重要了.

但我对这个问题答案的本质更感兴趣.一旦我释放了记忆,我怎么能确定它已被释放?我只是假设它吗? 这是一个纯粹的理论问题,背后没有实际的代码,而且大多数时候考虑我决定"好吧无论如何都没关系",但我对这个答案感到不安.

例如,如果内存是一个问题,我想确保在免费调用后释放一个大型结构,否则我会尝试再次清理,有没有办法做到这一点?

编辑:对于那些说明我的问题在这里回答的人:C中的函数free()对我不起作用 答案提供那里只是说我"实际上无法测试是否free()有效".我试图理解为什么不能这样做.免费背后的本质是什么?

编辑2:在阅读完答案之后,似乎我接受了我给朋友的答案,即"它只是有效".

c malloc free

7
推荐指数
2
解决办法
3235
查看次数

malloc和free调用期间物理页如何分配和释放?

Malloc 从进程的称为堆的虚拟内存区域之一分配内存。堆的初始大小是多少(在执行开始之后和任何 malloc 调用之前)?比如说,如果堆从 X 虚拟地址开始并以 Y 虚拟地址结束,我想知道 X 和 Y 之间的区别。

我已阅读之前提出的重复问题的答案。

malloc() 和 free() 如何工作?

写的答案都是在虚拟地址的上下文中,但我想知道物理页是如何分配的。我不确定,但我认为这个初始大小(XY)在操作系统中不会有相应的页表条目。如果我错了,请纠正我。

现在,假设有一个分配(和使用)10 字节内存的请求,将分配一个新页面。那么,所有进一步的内存请求都会从此页面得到满足,还是每次分配新页面时都会得到满足?谁来决定这个?

当内存被释放(使用 free())时,那么什么时候这个分配的物理页将被释放并标记为可用?据我所知,虚拟地址和物理页不会立即释放,因为释放的内存量可能会非常少。那么什么时候物理地址和虚拟地址对应的关联会终止呢?

如果我的问题听起来很奇怪,我很抱歉。我只是一个新手,试图了解内部原理。

c malloc operating-system linux-kernel

5
推荐指数
1
解决办法
4592
查看次数

密钥删除后ruby哈希内存泄漏

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,但并不是更好.

ruby hash memory-leaks memory-management

5
推荐指数
2
解决办法
1445
查看次数

malloc()如何知道堆的起始位置?

当OS将进程加载到内存中时,它会将堆栈指针初始化为虚拟地址,它决定堆栈应该进入进程的虚拟地址空间,程序代码使用该寄存器来知道堆栈变量的位置.我的问题是malloc()如何知道堆从哪个虚拟地址开始?堆是否总是存在于数据段的末尾,如果是这样,malloc()如何知道它在哪里?或者它甚至是一个连续的内存区域,还是只是随机穿插在数据部分中的其他全局变量?

c heap malloc

5
推荐指数
1
解决办法
3744
查看次数

malloc的最佳启发式

考虑使用malloc()在碎片堆中分配x个字节的内存.假设堆有多个大小大于x字节的连续位置.

哪个是最好的(导致最少的堆浪费)启发式选择以下位置?

  1. 选择大于x字节的最小位置.
  2. 选择大于x字节的最大位置.

我的直觉是比x字节大的最小位置.我不确定哪种是最好的.

不,这不是任何转让问题.我正在读这个怎么做malloc()和free()工作?这看起来像是一个很好的跟进问题.

algorithm malloc operating-system memory-management heuristics

4
推荐指数
1
解决办法
4149
查看次数

在C++中malloc/free和new/delete兼容性?

还有的malloc /自由和新的一个很好的比较/删除这里,好解释如何malloc()和free()的工作在这里.显然,我们不会混用它们 - 免费使用new或使用malloc删除.

我们可以看到许多开源项目,有许多贡献者,使用这两种机制,同时尊重上述"无混合"规则.通常,在一个文件中只有一种方式(一个作者,一个偏好).我已经分叉了这样一个项目,我正在使用new/delete添加一些功能.但我遇到了一些奇怪的记忆腐败.当然,我可能对他们负责,但.....

这让我想问一些"天真"的问题:

  1. 我可以在同一个编译单元(*.o)中同时使用malloc/free和new/delete机制 - 当然,尊重"无混合"规则?

  2. 我可以交错两种机制,就像在这段代码中一样吗?

    int *a = (int *) malloc (1000 * sizeof int);
    
    int *b = new int[1000];
    
    // some code
    
    free a;
    
    delete[] b;
    
    Run Code Online (Sandbox Code Playgroud)

c++ malloc free new-operator delete-operator

4
推荐指数
1
解决办法
3978
查看次数

malloc和heap:用于存储大小和链表信息的额外内存?

我有一个关于heap和的简单问题malloc:

当我们使用malloc如下方式分配一些内存空间时:

int *p;
p = (int*) malloc (10*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

它实际上在堆中分配了10个单词.但是,我的问题是:

实际使用的内存空间真的是10个字吗?

或者还有其他额外的空间来存储内存大小的值?

或者,甚至,因为堆被构造为链接列表,是否有其他内存空间用于存储指向堆中列表的下一个节点的地址?

c c++ memory heap malloc

4
推荐指数
1
解决办法
685
查看次数

传递指针的free()'know'如何有效?

我知道无效指针会导致未定义的行为,但是free如何知道指针是否有效?

在免费列表中每个块的开头是否有一种校验和?就像是:

if((*ptr) == 'CHECKSUM'))
  free
else
  do something undefined
Run Code Online (Sandbox Code Playgroud)

c free pointers

3
推荐指数
1
解决办法
358
查看次数

释放内存后我们如何访问指针?

按照我的理解,

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)

c malloc free pointers

3
推荐指数
1
解决办法
1106
查看次数

计算机(C编译器或其他东西)如何处理"自动数组声明"?| C语言

我试图从函数返回一个动态声明的数组; 到目前为止,我返回一个结构来保存指向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 arrays memory-management sizeof dynamic-arrays

2
推荐指数
1
解决办法
154
查看次数