2010-06-24 16 views
14
Bu örnekte

Kapsam dışı olduğunda dinamik bir dizi otomatik olarak dağıtılıyor mu?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

dizisi yok mu yoksa bellek sızıyor mu?

+0

Sızıntı olmayabilir, ancak kendi değişkenlerinizi serbest bırakmanız gerekir. SetLength'u yapın (sekme, 0); bu ekstra bir satır. Eğer endişeniz varsa, bunu bir deneme/sonlandırma bloğuna sarın. –

+2

Bu tavsiyeyi onaylayamıyorum, @Ryan. Tüm dizi değişkenlerinizi de el ile mi siliyorsunuz? Bir daha hiç kullanılmayan değişkenlere değerler atama kodunu gördüğümde, programcının dilin nasıl çalıştığını gerçekten anlamadığını söyler. Özellikle, derleyici, dinamik dizi değişkeninin temizlendiğinden emin olmak için zaten işlev gövdesinin etrafında bir sonuncu bloğu koyar. Kendi içlerinden birine koymak çok fazla. –

+0

@Ryan, bu yanlış. SetLength'a yapılan çağrı, hem tuş vuruşlarının hem de çalışma zamanında gereksiz bir işlev çağrısının toplam atığıdır. Dinamik diziler derleyici tarafından yönetilir ve kapsam dışında kaldıklarında otomatik olarak serbest bırakılır. –

cevap

14

Bellek serbest bırakıldı. (Yani, bellek sızıntısı yok!)

+4

Öğeler ayrıca derleyici tarafından yönetiliyorsa da serbest bırakılır (dyn dizileri, dizgiler, intf, bu tür kayıtlar vb.). – alex

+1

"Sekme: Tamsayı dizisi" için her şey boştur. "Sekme: TObject dizisi" veya başka bir sınıf için, Nesneleri kendiniz serbest bırakmanız gerekir. –

+0

Doğru, @Warren, ama bu dizi ile ilgisi yok. Aynı tavsiye sıradan bir skaler için de geçerlidir. Nesnelerin serbest bırakılması gerekir; tamsayılar yok. –

1

Dizilim otomatik olarak serbest bırakılır, ancak bazı nedenlerden ötürü belirsiz durumlar gördüm. Diziyi sıfırlayacak şekilde çözdüm.

+6

Serbest bırakılmamasının sadece iki nedeni vardır. Ya referans sayımını dağıtan işaretçilerle korkutucu bir şey yapıyorsunuz, ya da dizi, sızan bir nesne ya da kayıttan birine ait. –

+0

Biliyorum, bir şekilde otomatik olarak boşa gitmemesine neden olan başka bir şey vardı. Keşke bunu kanıtlamak için hala bir örneğim olsaydı! Ama yapmam. –

+0

Bu, derleyicinin kod-geninde bir hata olur. Ya da belki bir threadvar mıydı? Yardım, threadvar olarak kullanılan yönetilen türün kendilerini otomatik olarak serbest bırakmayacağını ve bunu manuel olarak yapmanız gerektiğini açıkça belirtir. –

İlgili konular