Bellek Yönetimi: Örnekler
Bu makalede, MFC'nin üç tipik bellek ayırma türünün her biri için çerçeve ayırmalarını ve yığın ayırmalarını nasıl gerçekleştirdiği açıklanmaktadır:
Bayt Dizisi Ayırma
Çerçevede bir bayt dizisi ayırmak için
Aşağıdaki kodda gösterildiği gibi diziyi tanımlayın. Dizi değişkeni kapsamından çıktığında dizi otomatik olarak silinir ve belleği geri kazanılır.
{ const int BUFF_SIZE = 128; // Allocate on the frame char myCharArray[BUFF_SIZE]; int myIntArray[BUFF_SIZE]; // Reclaimed when exiting scope }
Yığında bayt dizisi (veya herhangi bir ilkel veri türü) ayırmak için
new
bu örnekte gösterilen dizi söz dizimi ile işlecini kullanın:const int BUFF_SIZE = 128; // Allocate on the heap char* myCharArray = new char[BUFF_SIZE]; int* myIntArray = new int[BUFF_SIZE];
Dizileri yığından serbest bırakmak için
işlecini
delete
aşağıdaki gibi kullanın:delete[] myCharArray; delete[] myIntArray;
Veri Yapısını Ayırma
Çerçevede bir veri yapısı ayırmak için
Yapı değişkenini aşağıdaki gibi tanımlayın:
struct MyStructType { int topScore; }; void MyFunc() { // Frame allocation MyStructType myStruct; // Use the struct myStruct.topScore = 297; // Reclaimed when exiting scope }
Yapı tarafından kaplanan bellek, kapsamından çıktığında geri kazanılır.
Yığındaki veri yapılarını ayırmak için
Aşağıdaki örneklerde gösterildiği gibi yığındaki veri yapılarını ayırmak ve
delete
serbest bırakmak için kullanınnew
:// Heap allocation MyStructType* myStruct = new MyStructType; // Use the struct through the pointer ... myStruct->topScore = 297; delete myStruct;
Nesne Ayırma
Çerçevede bir nesne ayırmak için
nesnesini aşağıdaki gibi bildirin:
{ CMyClass myClass; // Automatic constructor call here myClass.SomeMemberFunction(); // Use the object }
Nesnenin yıkıcısı, nesne kapsamından çıktığında otomatik olarak çağrılır.
Yığında bir nesne ayırmak için
Yığındaki
new
nesneleri ayırmak için nesneye bir işaretçi döndüren işlecini kullanın. bunları silmek için işlecinidelete
kullanın.Aşağıdaki yığın ve çerçeve örneklerinde, oluşturucunun
CPerson
bağımsız değişken almaz olduğu varsayılır.// Automatic constructor call here CMyClass* myClass = new CMyClass; myClass->SomeMemberFunction(); // Use the object delete myClass; // Destructor invoked during delete
Oluşturucunun
CPerson
bağımsız değişkeni işaretçiysechar
, çerçeve ayırma deyimi şöyledir:CMyClass myClass("Joe Smith");
Yığın ayırma deyimi şöyledir:
CMyClass* myClass = new CMyClass("Joe Smith");