Semerkin Asked:2020-03-01 14:32:59 +0800 CST2020-03-01 14:32:59 +0800 CST 2020-03-01 14:32:59 +0800 CST 为什么需要动态内存 772 我曾经认为需要动态内存才能为类型数组分配内存,其大小在编译时是未知的。现在发现C++标准中没有VLA(虽然通过clang编译器的设置,可以实现VLA),但是C中有VLA。那么,如果可以启用 VLA,为什么还需要动态内存。我唯一的假设是堆栈大小被限制为比堆大小小得多的数字,因此在堆上分配了大量内存。 c++ 1 个回答 Voted Best Answer AnT stands with Russia 2020-03-01T15:00:15+08:002020-03-01T15:00:15+08:00 动态内存主要用于让用户手动控制创建对象的生命周期/存储持续时间。也就是简单的表示为了能够在块(函数)内部分配内存,退出这个块(函数),而内存保持分配状态。 这是动态内存的主要目的 - 实现动态存储持续时间,即 “永远”存在:直到内存被显式释放命令释放。这种对寿命的手动控制可用于延长或缩短寿命。 没有 VLA 可以帮助您解决这个问题。VLA 是本地自动对象,其生命周期遵循本地自动对象的规则。 例如,正是动态内存的这一特性,您可以在编译阶段创建具有未知数量节点的列表或树,即 在程序执行期间生成所需数量的节点对象。 动态内存的第二个最重要的目的是创建仅在运行时才知道类型的对象:多态对象或预先未知大小的数组。 最后,作为动态内存的第三个方面,我们可以命名对象的创建,其生命周期是完全自动的,但是对于自动内存来说太大了(不能放在堆栈上)。
动态内存主要用于让用户手动控制创建对象的生命周期/存储持续时间。也就是简单的表示为了能够在块(函数)内部分配内存,退出这个块(函数),而内存保持分配状态。
这是动态内存的主要目的 - 实现动态存储持续时间,即 “永远”存在:直到内存被显式释放命令释放。这种对寿命的手动控制可用于延长或缩短寿命。
没有 VLA 可以帮助您解决这个问题。VLA 是本地自动对象,其生命周期遵循本地自动对象的规则。
例如,正是动态内存的这一特性,您可以在编译阶段创建具有未知数量节点的列表或树,即 在程序执行期间生成所需数量的节点对象。
动态内存的第二个最重要的目的是创建仅在运行时才知道类型的对象:多态对象或预先未知大小的数组。
最后,作为动态内存的第三个方面,我们可以命名对象的创建,其生命周期是完全自动的,但是对于自动内存来说太大了(不能放在堆栈上)。