在本地范围内“在堆栈上”创建的对象具有所谓的自动存储持续时间。该标准说:
C++03 3.7.2 自动存储时长
1/ 明确声明为 auto 或 register 或未明确声明为 static 或 extern 的本地对象具有自动存储持续时间。这些对象的存储一直持续到创建它们的块退出。
2/ [注意:这些对象按照 6.7 中的描述进行初始化和销毁。]
关于销毁这些对象:
6.7 声明声明
2/ 具有自动存储持续时间(3.7.2)的变量在每次执行声明语句时都会被初始化。在块中声明的具有自动存储持续时间的变量在退出块时被销毁(6.6)。
因此,根据标准,当具有本地范围的对象超出范围时,将调用析构函数并释放存储空间。
天气与否,标准没有说存储是否在堆栈上。它只是说存储被释放,无论它在哪里。
某些架构没有 PC 所具有的堆栈。C++ 旨在用于任何类型的可编程设备。这就是为什么它从不提及堆栈、堆等的任何内容。
在运行 Windows 和用户模式代码的典型 PC 类型平台上,这些自动变量存储在堆栈中。这些堆栈是固定大小的,并在线程启动时创建。当它们被实例化时,它们会占用堆栈上的更多空间,并且堆栈指针会移动。如果你分配了足够多的这些变量,你会溢出堆栈,你的程序会死得很惨。
尝试在 Windows PC 上运行它,看看会发生什么,例如:
int main()
{
int boom[10000000];
for( int* it = &boom[0]; it != &boom[sizeof(boom)/sizeof(boom[0])]; ++it )
*it = 42;
}