Управление памятью. Примеры
В этой статье описывается, как 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");