内存管理:示例
本文介绍 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");