【问题标题】:Find free memory space using malloc function使用 malloc 函数查找空闲内存空间
【发布时间】:2014-03-14 18:38:14
【问题描述】:

所以基本上我想使用 malloc() 函数在我的计算机上找到可用的 Gb 数(只是整个 Gbs,忽略分数 Gb)。这是我使用的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argv, char **argc) {
    unsigned long size = 0;
    void *part[1000];
    int i = 0;

    part[size] = (void *)malloc(1024*1024*1024);

    if(part[size] == 0) 
        printf("The computer has less than 1 Gb of free memory\n"); 
    else {
        while((part[size] != NULL) && (size<1000)) {
            size++;
            part[size] = (void *)malloc(1024 *1024 *1024);
        }  
        while(i <= size) {
            free(part[size]);
        }
        printf("The computer has %luGb of free memory\n", size);
    }
    return 0;
}

结果是分段错误(核心转储),我真的不知道为什么会发生这种情况,如果有人能指出我错在哪里,我将不胜感激。 谢谢:)

【问题讨论】:

标签: c memory-management segmentation-fault malloc


【解决方案1】:

如果 malloc 成功 1000 次,您的代码将写入数组“部分”的末尾。

命名变量的方式非常令人困惑。尺寸是什么尺寸?它根本不是一个尺寸。这是成功分配块的计数。称之为:mallocedBlockCount。现在你知道它是什么了,它让你的代码更清晰,你的错误也更明显。

很明显,大小实际上并不是成功分配块的数量,而是少了一个。结果,测试大小

但实际上,整个方案并没有给你任何有用的东西,因为大多数操作系统都会让你分配大量的内存——只要你不使用它。如果你使用太多,有些会崩溃,有些会慢到爬行。

【讨论】:

    【解决方案2】:

    您遇到分段错误,因为您正在释放已释放的内存。 将您的第二个 while 循环更新为

    while(i <= size) {
        free(part[i]);
        i++;
    }
    

    正如 cmets 中所述,这不会为您提供系统上有多少可用内存,因为操作系统会为进程分配虚拟地址空间,但不能保证它的物理存储存在。这称为内存过量使用。在此处详细阅读 - What is Overcommit?

    另外,您不应该转换malloc 的结果。没有任何好处,如果您忘记包含 stdlib.h 头文件,它可能会导致错误。请阅读此Should I cast the result of malloc?

    【讨论】:

    • 我根据你所说的进行更改,但现在我收到总线错误(核心转储)。有什么建议吗?
    • 它在我的系统(Ubuntu 13.04 64 位)上运行良好并打印The computer has 1000GB of free memory。请再次检查您的代码并尝试使用 gdb 进行调试。
    【解决方案3】:

    下面的循环是无限的。循环中没有中断条件。

    while(i<=size){
       free(part[size]);
    }
    

    改成

    long size = 0; //change to to long from unsigned long to make sure below loop would work.
    
    
    while(size >= 0){
       free(part[size]);
       size--;
    }
    

    【讨论】:

      【解决方案4】:

      变化:

      while(i<=size)
          free(part[size]);
      

      收件人:

      for (i=0; i<size; i++)
          free(part[i]);
      

      顺便说一句,我认为它不会为您提供计算机上的可用 GB 数,而是为该进程分配的堆上的可用 GB 数。

      【讨论】:

      • 假设size == 1000时第一个while条件失败,你也应该释放part[size]
      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多