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ı: 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ı:
(22-07-2019, Saat: 08:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: 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ı:
(22-07-2019, Saat: 10:50)seci20 Adlı Kullanıcıdan Alıntı: 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ı:
(22-07-2019, Saat: 08:37)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: 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
  Çoklu Create yapma Kral 1 28 6 saat önce
Son Yorum: Halil Han BADEM
  kod timer icinde bir kere islesin sadikacar60 5 295 30-04-2024, Saat: 17:22
Son Yorum: sadikacar60
Sad Tabsheet içinde Form Create, Close olayları YILDIRIMBEY 0 278 24-08-2023, Saat: 17:26
Son Yorum: YILDIRIMBEY
  Thread içinde CoInitialize(nil) ve CoUninitialize serdar 6 1.147 22-08-2023, Saat: 09:50
Son Yorum: yhackup
  [Ödüllü Soru] Object türüne göre nesne üreten fonksiyon Abdullah ILGAZ 2 1.426 16-07-2023, Saat: 20:18
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi