内存管理:示例
本文介绍 MFC 如何分别为这三种典型内存分配执行帧分配和堆分配:
分配字节数组
在帧上分配字节数组
定义数组,如下面的代码所示。 当数组变量退出其作用域时,将自动删除该数组并回收其内存。
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
在堆上分配字节数组(或任何基元数据类型)
将
new
运算符与此示例中显示的数组语法结合使用:const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
从堆中释放数组
按如下所示使用
delete
运算符:delete[] myCharArray; delete[] myIntArray;
分配数据结构
在帧上分配数据结构
按如下所示定义结构变量:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
当结构退出其作用域时,将回收该结构占用的内存。
在堆上分配数据结构
使用
new
在堆上分配数据结构,使用delete
释放它们,如以下示例所示:// Heap allocation MyStructType* myStruct = new MyStructType; // Use the struct through the pointer ... myStruct->topScore = 297; delete myStruct;
分配对象
在帧上分配对象
按如下所示声明对象:
{ CMyClass myClass; // Automatic constructor call here myClass.SomeMemberFunction(); // Use the object }
当对象退出其作用域时,将自动调用该对象的析构函数。
在堆上分配对象
使用
new
运算符(该运算符将返回指向对象的指针)在堆上分配对象。 使用delete
运算符删除它们。以下堆和帧示例假定
CPerson
构造函数不采用任何参数。// Automatic constructor call here CMyClass* myClass = new CMyClass; myClass->SomeMemberFunction(); // Use the object delete myClass; // Destructor invoked during delete
如果
CPerson
构造函数的参数是指向char
的指针,则帧分配的语句如下:CMyClass myClass("Joe Smith");
堆分配的语句如下:
CMyClass* myClass = new CMyClass("Joe Smith");