我目前正在使用C / C ++。但是使用malloc / new而不是仅仅在堆栈上声明一些var的主要原因是什么。喜欢:int a;
或另一个例子:
int * a; //然后用它来跟踪一个数组
int a =(int )malloc(sizeof(int));
答案 0 :(得分:1)
自动变量的生命周期在程序离开声明它们的代码块时结束。有时候你希望他们活得更久;动态分配使您可以完全控制其生命周期。有时它们对于堆栈来说太大了;动态内存(通常)受限制较少。
有了这种灵活性,责任就在于:你需要在完成它们之后删除它们,而不是之前删除它们。如果你试着抓住一个原始指针并自己动手,这很难做到; so(在C ++中)了解RAII,并使用现成的管理类型(如智能指针和容器)为您完成工作。
答案 1 :(得分:0)
TL; DR:堆栈和堆是两个不同的内存区域,它们用于不同的目的,它们有自己的访问模式(包含所有内容)和策略(是的,堆栈内存方式更受控制比hw强制系统上的堆内存。)
堆栈内存是一种宝贵的,有限的资源,需要连续分配(你不能像堆分配一样对它进行分块)。
因此,它在许多x86平台上的默认维度通常约为1 MB(尽管可以增加)。关于堆分配可能分配多少内存,这绝对是小的。您的问题不是this question的完全重复,但我相信如果您对堆栈资源有限的其他原因感兴趣,请查看它。
其他原因包括可见范围(堆栈内容在范围的末尾被收集/销毁,而堆分配的内存可以在应用程序的其他部分中使用,直到您释放它为止)。
答案 2 :(得分:0)
C标准函数malloc()
及其朋友(free()
,calloc()
和realloc()
)允许动态分配任意大的(通过OS允许)内存块运行。这个非正式的名称动态存储持续时间(N1570的正式名称分配的存储持续时间)具有以下特征:
malloc()
和free()
来电推介。这不太可能自动存储持续时间变量,其寿命受范围限制(例如,阻止,更准确地说是{
和}
,但VLA除外)和静态存储持续时间,具有整个程序执行的生命周期
换句话说,当您在运行时需要最大的数据分配灵活性时,可以使用malloc()
。自动变量实际上受到堆栈大小的限制,静态变量需要编译时保留精确(即静态)的内存量。