Управление памятью. Примеры
В этом разделе описываются как MFC выполняет выделения кадра и выделения памяти для каждого из 3 типичных выделения памяти:
Массив байтов
Структура данных
Объект
Выделение массива байтов
Выбор массив байтов в кадре
Определите массив, как показано в следующем коде. Массив автоматически удаляется, и его освобождение памяти, если переменная массива не влияет на ее область.
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
Выбор массив байтов (или любой примитивный тип данных в куче)
Оператор новый с синтаксисом массива, показанный в следующем примере:
const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
Отменить массивы из кучи
Оператор удалить следующим образом:
delete [] myCharArray; delete [] myIntArray;
Выделение структуры данных
Выбор структуры данных в кадре
Определите переменную структуры следующим образом:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
Память занятая структурой фиксируется при ее не влияет на ее область.
Выбор структуры данных в куче
Используйте новый для выделения структуры данных в куче и удалить, чтобы отменить их, как показано в следующих примерах:
// 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 }
Деструктор для объекта автоматически вызывается, когда объект покидает его области.
Выбор объекта в куче
Оператор новый, который возвращает указатель на объект, чтобы выделить объекты в куче. Оператор удалить для удаления их.
В следующих примерах кучи и кадра высказывать конструктор 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");