在C中使用malloc()的主要原因是什么?

时间:2014-10-28 16:07:17

标签: c malloc

我目前正在使用C / C ++。但是使用malloc / new而不是仅仅在堆栈上声明一些var的主要原因是什么。喜欢:int a;

或另一个例子:

  1. int * a; //然后用它来跟踪一个数组

  2. int a =(int )malloc(sizeof(int));

3 个答案:

答案 0 :(得分:1)

自动变量的生命周期在程序离开声明它们的代码块时结束。有时候你希望他们活得更久;动态分配使您可以完全控制其生命周期。有时它们对于堆栈来说太大了;动态内存(通常)受限制较少。

有了这种灵活性,责任就在于:你需要在完成它们之后删除它们,而不是之前删除它们。如果你试着抓住一个原始指针并自己动手,这很难做到; so(在C ++中)了解RAII,并使用现成的管理类型(如智能指针和容器)为您完成工作。

答案 1 :(得分:0)

TL; DR:堆栈和堆是两个不同的内存区域,它们用于不同的目的,它们有自己的访问模式(包含所有内容)和策略(是的,堆栈内存方式更受控制比hw强制系统上的堆内存。)

堆栈内存是一种宝贵的,有限的资源,需要连续分配(你不能像堆分配一样对它进行分块)。

因此,它在许多x86平台上的默认维度通常约为1 MB(尽管可以增加)。关于堆分配可能分配多少内存,这绝对是小的。您的问题不是this question的完全重复,但我相信如果您对堆栈资源有限的其他原因感兴趣,请查看它。

其他原因包括可见范围(堆栈内容在范围的末尾被收集/销毁,而堆分配的内存可以在应用程序的其他部分中使用,直到您释放它为止)。

答案 2 :(得分:0)

C标准函数malloc()及其朋友(free()calloc()realloc())允许动态分配任意大的(通过OS允许)内存块运行。这个非正式的名称​​动态存储持续时间(N1570的正式名称​​分配的存储持续时间)具有以下特征:

    {li> 生命周期malloc()free()来电推介。这不太可能自动存储持续时间变量,其寿命受范围限制(例如,阻止,更准确地说是{},但VLA除外)和静态存储持续时间,具有整个程序执行的生命周期
  • 范围取决于指向已分配数据的指针的可用性

换句话说,当您在运行时需要最大的数据分配灵活性时,可以使用malloc()。自动变量实际上受到堆栈大小的限制,静态变量需要编译时保留精确(即静态)的内存量。