Öbek vs. Delphi Geliştiricileri için Yığın

click fraud protection

"DoStackOverflow" işlevini bir kez senin kodun ve sen alacaksın EStackOverflow "yığın taşması" iletisiyle Delphi tarafından yükseltilen hata.


fonksiyon DoStackOverflow: integer;

başla

 sonuç: = 1 + DoStackOverflow;

son;

Bu "yığın" nedir ve neden yukarıdaki kodu kullanarak taşma var?

Bu nedenle, DoStackOverflow işlevi kendini bir "çıkış stratejisi" olmadan yinelemeli olarak çağırıyor - sadece dönmeye devam ediyor ve asla çıkmıyor.

Yapacağınız hızlı bir düzeltme, sahip olduğunuz açık hatayı temizlemek ve işlevin bir noktada var olmasını sağlamaktır (böylece kodunuz işlevi çağırdığınız yerden çalışmaya devam edebilir).

Devam edersiniz ve asla geriye bakmazsınız, şimdi çözüldüğü gibi hatayı / istisnayı önemsemezsiniz.

Yine de soru şu: bu yığın nedir ve neden taşma var?

Delphi Uygulamalarınızdaki Bellek

Delphi'de programlamaya başladığınızda, yukarıdaki gibi bir hatayla karşılaşabilirsiniz, çözer ve devam edersiniz. Bu, bellek ayırma ile ilgilidir. Çoğu zaman bellek ayırmayı umursamadığınız sürece yarattıklarını serbest bırak.

instagram viewer

Delphi'de daha fazla deneyim kazandıkça, kendi sınıflarınızı oluşturmaya başlar, onları başlatır, bellek yönetimi ve benzerlerine önem verirsiniz.

Yardım'da şöyle bir şey okuyacağınız noktaya geleceksiniz: "Yerel değişkenler (yordamlar ve işlevler dahilinde bildirilmiştir) bir uygulamanın yığın." ve ayrıca Sınıflar referans türleridir, bu nedenle ödev üzerine kopyalanmazlar, referans olarak iletilirler ve yığın.

Peki, "yığın" nedir ve "yığın" nedir?

Stack vs. Yığın

Uygulamanızı Windows üzerinde çalıştırma, bellekte uygulamanızın veri depoladığı üç alan vardır: genel bellek, yığın ve yığın.

Global değişkenler (değerleri / verileri) global bellekte saklanır. Genel değişkenler için bellek, program başlatıldığında uygulamanız tarafından ayrılır ve programınız sona erene kadar ayrılmış olarak kalır. Global değişkenlerin hafızasına "veri segmenti" denir.

Global bellek yalnızca bir kez program sonlandırıldığında ayrıldığı ve serbest bırakıldığı için, bu makalede bunu umursamıyoruz.

Yığın ve yığın, dinamik bellek ayırmanın gerçekleştiği yerlerdir: bir işlev için değişken oluşturduğunuzda, bir işleve parametreler gönderdiğinizde ve sonucunu kullandığınızda / geçtiğinizde bir sınıf örneği oluşturduğunuzda değer.

Yığın Nedir?

Bir işlevin içindeki bir değişkeni bildirdiğinizde, değişkeni tutmak için gereken bellek yığından ayrılır. Basitçe "var x: integer" yazarsınız, fonksiyonunuzda "x" kullanırsınız ve fonksiyondan çıkıldığında bellek ayırma veya boşaltma ile ilgilenmezsiniz. Değişken kapsam dışına çıktığında (kod işlevden çıkar), yığın üzerinde alınan bellek boşaltılır.

Yığın belleği, LIFO ("son giren ilk çıkar") yaklaşımı kullanılarak dinamik olarak ayrılır.

İçinde Delphi programları, yığın bellek tarafından kullanılır

  • Yerel rutin (yöntem, prosedür, fonksiyon) değişkenleri.
  • Rutin parametreler ve dönüş tipleri.
  • Windows API işlevi çağırır.
  • Kayıtlar (bu yüzden açıkça bir kayıt türünün bir örneğini oluşturmanız gerekmez).

Örneğin, bir işleve yerel bir değişken bildirdiğinizde, bellek sizin için otomatik olarak ayrıldığından, yığındaki belleği açıkça boşaltmanız gerekmez. İşlev çıktığında (bazen daha önce Delphi derleyici optimizasyonu nedeniyle bile) değişkenin belleği otomatik olarak sihirli bir şekilde serbest bırakılır.

Yığın bellek boyutu varsayılan olarak, Delphi programlarınız için yeterince büyüktür. Projenizin Bağlayıcı seçeneklerindeki "Maksimum Yığın Boyutu" ve "Minimum Yığın Boyutu" değerleri varsayılan değerleri belirtir -% 99,99'da bunu değiştirmeniz gerekmez.

Bir yığını bellek blokları yığını olarak düşünün. Yerel bir değişken bildirdiğinizde / kullandığınızda, Delphi bellek yöneticisi bloğu üstten seçer, kullanır ve artık gerekmediğinde yığına geri döndürülür.

Yığından yerel değişken bellek kullanıldığında, yerel değişkenler bildirildiğinde başlatılmaz. Bazı işlevlerde "var x: integer" değişkenini bildirin ve işleve girdiğinizde değeri okumaya çalışın - x bazı "garip" sıfır olmayan değerlere sahip olacaktır. Bu nedenle, değerlerini okumadan önce her zaman yerel değişkenlerinize değer verin (veya değeri ayarlayın).

LIFO nedeniyle, yığını (bellek ayırma) işlemleri hızlıdır çünkü yığını yönetmek için yalnızca birkaç işlem (push, pop) gerekir.

Öbek Nedir?

Yığın, dinamik olarak ayrılmış belleğin saklandığı bir bellek bölgesidir. Bir sınıf örneği oluşturduğunuzda, bellek yığından ayrılır.

Delphi programlarında yığın bellek / tarafından kullanılır

  • Sınıf örneği oluşturma.
  • Dinamik diziler oluşturma ve yeniden boyutlandırma.
  • GetMem, FreeMem, New and Dispose () kullanarak belleği açıkça ayırma.
  • ANSI / wide / Unicode dizeleri, varyantları, arayüzleri (Delphi tarafından otomatik olarak yönetilir) kullanma.

Yığın bellek, bazı blokların bellek bloklarını tahsis edeceği güzel bir düzene sahip değildir. Yığın bir kutu mermere benziyor. Yığından bellek ayırma rastgele, buradan bir blok daha oradan bir blok. Bu nedenle, yığın işlemleri yığındaki işlemlerden biraz daha yavaştır.

Yeni bir bellek bloğu istediğinizde (yani bir sınıf örneği oluşturduğunuzda), Delphi bellek yöneticisi bunu sizin için halledecektir: yeni bir bellek bloğu veya kullanılmış ve atılan bir blok alırsınız.

Yığın tüm sanal bellekten (RAM ve disk alanı).

Belleği Manuel Olarak Atama

Artık bellekle ilgili her şey açık olduğundan, güvenli bir şekilde (çoğu durumda) yukarıdakileri görmezden gelebilir ve dün yaptığınız gibi Delphi programlarını yazmaya devam edebilirsiniz.

Tabii ki, belleği ne zaman ve nasıl ayıracağınızı / boşaltılacağınızı bilmelisiniz.

"EStackOverflow" (makalenin başından itibaren) yükseltildi çünkü DoStackOverflow'a yapılan her çağrıda yığından yeni bir bellek parçası kullanıldı ve yığının sınırlamaları var. Kadar basit.

instagram story viewer