Správa paměti: Příklady
Tento článek popisuje, jak MFC provádí přidělování rámců a přidělení haldy pro každý ze tří typických druhů přidělení paměti:
Přidělení pole bajtů
Přidělení pole bajtů v rámci
Definujte pole, jak je znázorněno následujícím kódem. Pole se automaticky odstraní a jeho paměť se uvolní, když proměnná pole ukončí svůj obor.
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
Přidělení pole bajtů (nebo jakéhokoli primitivního datového typu) v haldě
new
Použijte operátor se syntaxí pole znázorněnou v tomto příkladu:const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
Uvolnění polí z haldy
delete
Operátor použijte následujícím způsobem:delete[] myCharArray; delete[] myIntArray;
Přidělení datové struktury
Přidělení datové struktury v rámci
Definujte proměnnou struktury následujícím způsobem:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
Paměť obsazená strukturou se uvolní, když ukončí svůj obor.
Přidělení datových struktur v haldě
Slouží
new
k přidělování datových struktur v haldě adelete
k jejich uvolnění, jak je znázorněno v následujících příkladech:// Heap allocation MyStructType* myStruct = new MyStructType; // Use the struct through the pointer ... myStruct->topScore = 297; delete myStruct;
Přidělení objektu
Přidělení objektu v rámci
Deklarujte objekt následujícím způsobem:
{ CMyClass myClass; // Automatic constructor call here myClass.SomeMemberFunction(); // Use the object }
Destruktor objektu se automaticky vyvolá při ukončení oboru objektu.
Přidělení objektu v haldě
Pomocí operátoru
new
, který vrátí ukazatel na objekt, přidělit objekty v haldě. Pomocí operátorudelete
je odstraňte.Následující příklady haldy a rámce předpokládají, že
CPerson
konstruktor nepřijímá žádné argumenty.// Automatic constructor call here CMyClass* myClass = new CMyClass; myClass->SomeMemberFunction(); // Use the object delete myClass; // Destructor invoked during delete
Pokud je argumentem konstruktoru
CPerson
ukazatel nachar
, příkaz pro přidělení rámce je:CMyClass myClass("Joe Smith");
Příkaz pro přidělení haldy je:
CMyClass* myClass = new CMyClass("Joe Smith");