Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Fonksiyon içinde create edilenler
#1
Merhaba ustalarım.  Diyelim bir foksiyon içinde bir memorystream create ettik. Bunu foksiyon içinde free yapmadan foksiyon bittiğinde otomatik free ediyormu ? Birde etmiyorsa bunu nasıl gözlemleyebilirim ? Create ettiğimiz objeleri nasıl görebilirim ?
Cevapla
#2
Delphi'de Garbage Collection benzeri bir çöp toplama mekanizması yok. Lâkin hafızayı efektif kullanmak için çeşitli yollar var elbette. Bunlardan bir tanesi Owner mekanizması bir diğeri de sınıfların interface implemente etmeleri. Elbette en önemli husus, programcı disiplini. Oluşturduğumuz nesneyi yok etmek'de bizim işimiz olmalı normalde.

 Sorunuza daha açık yanıt vermek gerekir ise; hayır bir memory stream ilgili scope'dan çıkılınca kendi kendine free olmaz. Bunun için ilgili nesnenin bir interface implemente etmiş olması gerekir. Oluşturduğunuz nesnelerin temizlenmediğini düşünüyor iseniz ve Delphi'nin yeni versiyonlarından birisini kullanıyorsanız; bu durumda ReportMemoryLeaksOnShutdown := true atamasını yapın, programınızı kullanın ve kapatın. Kapattığınızda hafıza kaçakları ile ilgili bir kısım bilgi sunulacak size(eğer var ise).
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
(22-07-2019, Saat: 08:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Delphi'de Garbage Collection benzeri bir çöp toplama mekanizması yok. Lâkin hafızayı efektif kullanmak için çeşitli yollar var elbette. Bunlardan bir tanesi Owner mekanizması bir diğeri de sınıfların interface implemente etmeleri. Elbette en önemli husus, programcı disiplini. Oluşturduğumuz nesneyi yok etmek'de bizim işimiz olmalı normalde.

 Sorunuza daha açık yanıt vermek gerekir ise; hayır bir memory stream ilgili scope'dan çıkılınca kendi kendine free olmaz. Bunun için ilgili nesnenin bir interface implemente etmiş olması gerekir. Oluşturduğunuz nesnelerin temizlenmediğini düşünüyor iseniz ve Delphi'nin yeni versiyonlarından birisini kullanıyorsanız; bu durumda ReportMemoryLeaksOnShutdown := true atamasını yapın, programınızı kullanın ve kapatın. Kapattığınızda hafıza kaçakları ile ilgili bir kısım bilgi sunulacak size(eğer var ise).

Hocam cevap verdiğiniz için çok teşekkür ederim. Kaçak varmış 4 tane kadar ama adlarını vermiyor bunu öğrenmenin bir yolu yokmu acaba ?
Cevapla
#4
(22-07-2019, Saat: 10:50)seci20 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-07-2019, Saat: 08:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Delphi'de Garbage Collection benzeri bir çöp toplama mekanizması yok. Lâkin hafızayı efektif kullanmak için çeşitli yollar var elbette. Bunlardan bir tanesi Owner mekanizması bir diğeri de sınıfların interface implemente etmeleri. Elbette en önemli husus, programcı disiplini. Oluşturduğumuz nesneyi yok etmek'de bizim işimiz olmalı normalde.

 Sorunuza daha açık yanıt vermek gerekir ise; hayır bir memory stream ilgili scope'dan çıkılınca kendi kendine free olmaz. Bunun için ilgili nesnenin bir interface implemente etmiş olması gerekir. Oluşturduğunuz nesnelerin temizlenmediğini düşünüyor iseniz ve Delphi'nin yeni versiyonlarından birisini kullanıyorsanız; bu durumda ReportMemoryLeaksOnShutdown := true atamasını yapın, programınızı kullanın ve kapatın. Kapattığınızda hafıza kaçakları ile ilgili bir kısım bilgi sunulacak size(eğer var ise).

Hocam cevap verdiğiniz için çok teşekkür ederim. Kaçak varmış 4 tane kadar ama adlarını vermiyor bunu öğrenmenin bir yolu yokmu acaba ?

Tuğrul Bey ilgili interface içinde yapılırsa ve sınıfa implemente edilirse create edilen nesnelerin takibini yapmak zorunda değilmiyiz. 

Konuyla iligli örnek yada kaynak için yardımcı olabilir misiniz.

Teşekkürler.
Cevapla
#5
(22-07-2019, Saat: 11:18)CumaParlak Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-07-2019, Saat: 10:50)seci20 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam cevap verdiğiniz için çok teşekkür ederim. Kaçak varmış 4 tane kadar ama adlarını vermiyor bunu öğrenmenin bir yolu yokmu acaba ?

Tuğrul Bey ilgili interface içinde yapılırsa ve sınıfa implemente edilirse create edilen nesnelerin takibini yapmak zorunda değilmiyiz. 

Konuyla iligli örnek yada kaynak için yardımcı olabilir misiniz.

Teşekkürler.

Bir sınıf interface implemente etmeye başladığında otomatik referans sayımı mekanizmasına dahil olur. İlgili nesneye referans 0(sıfır)'a düştüğünde otomatikman Destroy metodu çağrılır. Dolayısı ile nesne yok edilir. Bir nesneye işaret eden değişkenler (pointer'lar) tanımlandıkları scope'dan çıkıldığında (tabii interface implemente etmiş bir sınıfın nesne örneğine işaret eden bir değişkeni kast ediyorum); nil'e set edilir. Dolayısı ile referans değeri 1(bir) azaltılır.

Konu ile ilgili bir kısım malümatı sitemde bulabilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
(22-07-2019, Saat: 10:50)seci20 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-07-2019, Saat: 08:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Delphi'de Garbage Collection benzeri bir çöp toplama mekanizması yok. Lâkin hafızayı efektif kullanmak için çeşitli yollar var elbette. Bunlardan bir tanesi Owner mekanizması bir diğeri de sınıfların interface implemente etmeleri. Elbette en önemli husus, programcı disiplini. Oluşturduğumuz nesneyi yok etmek'de bizim işimiz olmalı normalde.

 Sorunuza daha açık yanıt vermek gerekir ise; hayır bir memory stream ilgili scope'dan çıkılınca kendi kendine free olmaz. Bunun için ilgili nesnenin bir interface implemente etmiş olması gerekir. Oluşturduğunuz nesnelerin temizlenmediğini düşünüyor iseniz ve Delphi'nin yeni versiyonlarından birisini kullanıyorsanız; bu durumda ReportMemoryLeaksOnShutdown := true atamasını yapın, programınızı kullanın ve kapatın. Kapattığınızda hafıza kaçakları ile ilgili bir kısım bilgi sunulacak size(eğer var ise).

Hocam cevap verdiğiniz için çok teşekkür ederim. Kaçak varmış 4 tane kadar ama adlarını vermiyor bunu öğrenmenin bir yolu yokmu acaba ?

Bunun için de bir kaç yol var. Maalesef Delphi'nin memory leak tespit aracı nispeten kısıtlı. Aşağıdaki yollardan birisini kullanabilirsiniz.
  - EurekaLog indirip onu kullanın.
  - MadExcept kullanabilirsiniz.
  - FastMM Full Debug mode kullanabilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
Yeri gelmişken küçük de bir araştırma için size şevk vermeye çalışayım:

ReportMemoryLeaksOnShutdown := true; iken;
-------------------------------------------------------------
1- Aşağıdaki kodun çalışmasını sağlayın, ardından uygulamayı kapatın. Ne görüyorsunuz, neden ?
procedure TForm1.Button1Click(Sender: TObject);
begin
 TButton.Create(nil);
end;

2- Aşağıdaki kodun çalışmasını sağlayın, ardından uygulamayı kapatın. Ne görüyorsunuz, neden ?
procedure TForm1.Button1Click(Sender: TObject);
begin
 TButton.Create(Self);
end;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
Yanlışım varsa af ola.
cümleleri tam kuramaz isen af ola.

TButton.Create(nil);

komutunda birden çok hafıza taşması oldu.

TButton.Create(Self);

herhangi bir hafıza taşması olmadı.
  • Nil   nesnenin sahibi olmadığını  için oluşturulan nesneyi yok etmek oluşturanın (bizim sorumluluğumuzda) formun close olayına  TButton.Free eklenmeli



  • Self  , yöntemin çağrıldığı nesneyi belirtir.  button1 OnClick  olayına  self ile oluşturunca yeni oluşan button 'nun sahibi button1 olur button1 in sahibi form1 olduğundan 
  • form1 kapatılırken  button1 kapatır  button1 kapanırken TButton.Create(Self) oluşan button kapanır.
anlatım bozukluğu için özür.
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#9
En güzel açıklamayı kodun kendisi yapacaktır. TComponent.Create ve TComponent.Destroy metodlarını incelemek çok yararlı olacaktır ;-)
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Form içinde exe nasıl çalıştırılır? Cyb3r 2 378 04-07-2019, Saat: 09:53
Son Yorum: Cyb3r
  Create edilen button olay ekleme. KUNTAY 4 389 26-05-2019, Saat: 15:19
Son Yorum: KUNTAY
  fonksiyon içinde parametreye default değer atama sorunu adelphiforumz 6 456 24-05-2019, Saat: 11:20
Son Yorum: adelphiforumz
  Formların bazen create olmaması ve butonların tıklanmaması hakkında smyrna231802 11 811 11-04-2019, Saat: 09:54
Son Yorum: smyrna231802
  SQL de Aynı Tablo İçinde Kopyalamak OZCANK 7 552 09-04-2019, Saat: 11:00
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi