内存管理:帧分配

帧上的分配从调用函数时设置的“堆栈帧”中获取其名称。 堆栈帧是一个内存区域,可暂时保存函数的参数以及函数本地定义的任何变量。 帧变量通常称为“自动”变量,因为编译器会自动为其分配空间。

帧分配有两个关键特征。 首先,定义局部变量时,在堆栈帧上分配足够的空间来容纳整个变量,即使它是大型数组或数据结构也是如此。 其次,帧变量在超出范围时自动删除:

void MyFunction()
{
   // Local object created on the stack
   CString strName;
   // Object goes out of scope and is deleted as function ends
}

对于局部函数变量,此范围转换在函数退出时发生,但如果使用嵌套大括号,则帧变量的范围可能小于函数。 这种自动删除帧变量非常重要。 对于简单基元类型(如int字节)、数组或数据结构,自动删除只会回收变量使用的内存。 由于变量超出了范围,因此无论如何都无法访问该变量。 但是,对于C++对象,自动删除过程会稍微复杂一些。

当对象定义为帧变量时,会在遇到定义时自动调用其构造函数。 当对象超出范围时,会在回收对象的内存之前自动调用其析构函数。 这种自动构造和销毁可能非常方便,但必须注意自动调用,尤其是对析构函数的调用。

在帧上分配对象的主要优点是自动删除对象。 在帧上分配对象时,无需担心忘记的对象会导致内存泄漏。 (有关内存泄漏的详细信息,请参阅文章 “检测 MFC 中的内存泄漏”。帧分配的缺点是帧变量不能在其范围之外使用。 选择帧分配与堆分配的另一个因素是,对于大型结构和对象,通常最好使用堆而不是堆栈进行存储,因为堆栈空间通常受到限制。

另请参阅

内存管理