我们都知道C语言提供了malloc等函数让程序员手动来分配释放堆空间,而栈空间一般是自动分配与释放的。
这里我要补充两点:
1.栈也是能动态分配的,C语言提供了alloca函数让程序员动态分配栈内存,且不需要手动释放,对没错,你来分配,主调函数返回时由编译器(生成的类析构程序)来给你擦屁股。但alloca不具可移植性, 而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上.
由于这些原因, alloca不宜使用在必须广泛移植的程序中, 一般使用的很少,不管它可能多么有用。
2.栈内存到底由谁来管理(释放)的问题。网上有的说是由编译器释放;有的说是由编译器确定,系统来释放。
对第一种说法,有人会说,编译器只在编译时候才用到,而栈内存在运行时才分配释放,与编译器有啥关系? 这就造成了误解。
对于第二种说法就更让人费解,什么叫由编译器确定?系统来释放?这里的系统是操作系统还是编译系统?一般人会误解读为操作系统释放内存。那如果是裸机呢哈哈?
我想说的是这些说法都不严谨,或者说含糊其辞,没有说到点上。
敲重点,看黑板:
严格来说栈是由类似c++中的析构函数来释放,而这个析构程序不是你写的,是编译器在编译期间自动生成的。程序运行时,就会在对象生命周期结束时执行。