Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как 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");