Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Memory Leak Sorunu
#1
Selamlar böyle bir fonksiyonum var.
ama Connection nesnem free olmuyor neyi atlıyorum ben ?



function Tyhackup.getName(phones: string): GetInfo;
begin
with getNewQuery(ArMyConnect()) do
 try
  ///
 ///
 finally
 Free;
 Connection.Free;
end;
end;

getNewQuery fonksiyonum da bu şekilde,

function Tyhackup.getNewQuery(pConnection: TMyConnection): TMyquery;
begin
 result := TMyQuery.Create(nil);
 result.Connection := pConnection;
end;

Connection nesnemde bu şekilde
function ARMyConnect(): TMyConnection;
begin
 try
   Result := TMyConnection.Create(nil);
   Result.Server := 'xxxx';
   Result.Port := 3306;
   Result.Database := 'xx';
   Result.Username := 'xx';
   Result.Password := 'xx';
   Result.Options.Charset := 'latin5';
   Result.LoginPrompt := False;
   Result.Options.UseUnicode := True;
 except
   on E: Exception do
 end;
end;

015RYD.png
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#2
Öncelikle ARMyConnect() sonucu dönen TMyConnection nesnesi Free edilmiyor.
getNewQuery'yi Free ettikten sonra onun connection'ı üzerinde nasıl işlem yapabiliyorsun...

function Tyhackup.getName(phones: string): GetInfo;
begin
  conn = ArMyConnect()
  try
    with getNewQuery(conn) do
    try
      //
    finally
      Free;
    end;
  finally
    conn.Free;
  end;
end;
There's no place like 127.0.0.1
WWW
Cevapla
#3
(08-05-2017, Saat: 10:27)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlÖncelikle ARMyConnect() sonucu dönen TMyConnection nesnesi Free edilmiyor.
getNewQuery'yi Free ettikten sonra onun connection'ı üzerinde nasıl işlem yapabiliyorsun...

function Tyhackup.getName(phones: string): GetInfo;
begin
  conn = ArMyConnect()
  try
    with getNewQuery(conn) do
    try
      //
    finally
      Free;
    end;
  finally
    conn.Free;
  end;
end;

finally de, Connection.Free; demem, getnewquery'nin bağlı olduğu Connection nesnesini free etmez mi ?
önce Connection free etsem getnewquery de hata oluşturmaz mı ?

Edit:

Sorunu anladım çözdüm teşekkürler.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#4
(08-05-2017, Saat: 10:43)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(08-05-2017, Saat: 10:27)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlÖncelikle ARMyConnect() sonucu dönen TMyConnection nesnesi Free edilmiyor.
getNewQuery'yi Free ettikten sonra onun connection'ı üzerinde nasıl işlem yapabiliyorsun...

function Tyhackup.getName(phones: string): GetInfo;
begin
  conn = ArMyConnect()
  try
    with getNewQuery(conn) do
    try
      //
    finally
      Free;
    end;
  finally
    conn.Free;
  end;
end;

finally de, Connection.Free; demem, getnewquery'nin bağlı olduğu Connection nesnesini free etmez mi ?
önce Connection free etsem getnewquery de hata oluşturmaz mı ?

Edit:

Sorunu anladım çözdüm teşekkürler.

Merhaba,

Bu sorunu daha erken farkedememenizin sebebi 2-3 hece daha az yazacağım ya da değişken tanımlamayacağım diye "with" kullanmış olmanız. Size tavsiyem bir an önce with'i kullanmaktan vazgeçin. Hem debug etmeyi, hem de kodu okumayı çok zorlaştırıyor. Keşke Delphi with özelliğini dilden yavaş yavaş çıkarsa (tamam, çıkarırsa çok sorun çıkar ama en azından warning verse o bile yeter. Yeni programcılar kullanmaktan çekinirler).

İyi çalışmalar
Cevapla
#5
Bence de mümkün olduğunca with'ten uzak durmakta fayda var
There's no place like 127.0.0.1
WWW
Cevapla
#6
(08-05-2017, Saat: 10:56)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(08-05-2017, Saat: 10:43)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olfinally de, Connection.Free; demem, getnewquery'nin bağlı olduğu Connection nesnesini free etmez mi ?
önce Connection free etsem getnewquery de hata oluşturmaz mı ?

Edit:

Sorunu anladım çözdüm teşekkürler.

Merhaba,

Bu sorunu daha erken farkedememenizin sebebi 2-3 hece daha az yazacağım ya da değişken tanımlamayacağım diye "with" kullanmış olmanız. Size tavsiyem bir an önce with'i kullanmaktan vazgeçin. Hem debug etmeyi, hem de kodu okumayı çok zorlaştırıyor. Keşke Delphi with özelliğini dilden yavaş yavaş çıkarsa (tamam, çıkarırsa çok sorun çıkar ama en azından warning verse o bile yeter. Yeni programcılar kullanmaktan çekinirler).

İyi çalışmalar

Ne yazık ki warning'leri okuyan bile yok. Uygulamayı bi derliyorsun yüzlerce warning, hint var. Hatta o kadar çok warning varki milletin uygulamasında adam deprecated yazan metod'ların bile farkında değil, anca tamamen kaldırılıp patladığında görüyor ne yazık ki Smile
Cevapla
#7
Doğru söylüyorsunuz, daha az yazalım diye kullanıyorum ara ara ama bırakacağım dediğiniz gibi.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#8
With ile alakalı internette gördüğüm bir örneği paylaşmak istiyorum:
with TFoo.Create
try
 Bar := Baz;
 DoSomething();
finally
 Free;
end;
TFoo'nun Bar özelliğine Baz değerini atıyorsunuz (Buradaki Baz lokal/global bir değişken vs. olabilir). Aradan zaman geçtikten sonra siz yada başka bir yazılımcı TFoo sınıfına Baz özelliği eklerse sizin hiiiiiiç haberiniz olmadan programınız hatalı sonuç üretecek.  Smile
There's no place like 127.0.0.1
WWW
Cevapla
#9
(08-05-2017, Saat: 12:41)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlWith ile alakalı internette gördüğüm bir örneği paylaşmak istiyorum:
with TFoo.Create
try
 Bar := Baz;
 DoSomething();
finally
 Free;
end;
TFoo'nun Bar özelliğine Baz değerini atıyorsunuz (Buradaki Baz lokal/global bir değişken vs. olabilir). Aradan zaman geçtikten sonra siz yada başka bir yazılımcı TFoo sınıfına Baz özelliği eklerse sizin hiiiiiiç haberiniz olmadan programınız hatalı sonuç üretecek.  Smile

Güzel kullanım aslında her seferinde adını yazmaktansa
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#10
Yıllardır "with" kullanırım hiç problem yaşamadım. Doğru notasyon ile global/local problemi yaşamazsınız.
Ek olarak Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol gibi bir dökümantasyon aracı kullanarak kodların daha anlaşılır olması sağlanabilir.
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Lisanslama Sorunu Hk. glagher 11 502 07-07-2018, Saat: 10:40
Son Yorum: engerex
  Aes şifreleme sorunu seci20 3 183 18-06-2018, Saat: 11:45
Son Yorum: sadettinpolat
  RSA anahtarı hesaplama sorunu seci20 8 335 14-06-2018, Saat: 15:19
Son Yorum: seci20
  DbBrowser-Veritabanı kilitlenme sorunu ? BY-HAYALET 2 128 08-06-2018, Saat: 21:13
Son Yorum: BY-HAYALET
  Rusça Karakter Sorunu gonulali 4 250 25-04-2018, Saat: 11:07
Son Yorum: gonulali



Konuyu Okuyanlar: 1 Ziyaretçi