(10-09-2018, Saat: 17:57)uparlayan Adlı Kullanıcıdan Alıntı: Ufak bir soru sorabilir miyim?
Bir kaç kez boyutu değiştirilmiş dinamik bir dizede, dizi elemanları pointer açısından bellekte ardışık mı tutulur? yani burada bir heap'mi yoksa stack mı söz konusudur?
Soru başka bir eksiği görmemde yardımcı oldu.
Aşağıdaki örnekte Arr ismindeki array'i 2 defa boyutlandırdık.
var
Arr: array of Integer;
begin
SetLength(Arr, 2); // 1. tahsis
SetLength(Arr, 3); // 2. tahsis
end;
implement etmeye çalıştığım örnekte sadece 1 defa boyutlandırma var.Yeniden boyutlandırma gibi bir imkan şuan yok.
Aşağıdaki array 2 elemanlı, daha sonra eleman sayısını arttırmak ya da azaltmak istersem böyle bir özellik yok.
var
MyArray : TDynamicArray<Integer>;
Value : Integer;
begin
MyArray := TDynamicArray<Integer>.Create(2);
MyArray[0] := 34;
MyArray[1] := 35;
MyArray.Free;
end.
Demek ki; MyArray.SetLength(3); gibi method eklemek lazım.
Dolayısıyla delphi'deki SetLength fonksiyonuna benzer bir şekilde kullanımı olabilir.
var
MyArray : TDynamicArray<Integer>;
Value : Integer;
begin
MyArray := TDynamicArray<Integer>.Create(2);
MyArray[0] := 34;
MyArray[1] := 35;
MyArray.SetLength(3);
MyArray[0] := 36;
MyArray[1] := 37;
MyArray[2] := 38;
MyArray.Free;
end.
Tabi MyArray.SetLength methodu içinde (realloc,HeapReAlloc,ReallocMem,ReallocMemory vs) gibi hafıza yönetim fonksiyonlarından biri ile tekrar bir boyutlandırma yapmak gerekecek.
Bu arada
HeapReAlloc için dokümanda şöyle bir açıklama var.
Alıntı:If HeapReAlloc fails, the original memory is not freed, and the original handle and pointer are still valid.
HeapReAlloc başarısızsa, orginal hafıza bloğu serbest bırakılmaz...
O zaman aklıma şu geliyor.Başarılı ise daha önce HeapAlloc ile tahsis edilen blok siliniyor.
En iyisi windows özelinde bu işi
HeapWalk api'sini
deneyerek gözlemlemek...