Delphi Can

Orjinalini görmek için tıklayınız: Memory Leak Sorunu
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2 3
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
Ö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;
(08-05-2017, Saat: 10:27)SimaWB Adlı Kullanıcıdan Alıntı: [ -> ]Ö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.
(08-05-2017, Saat: 10:43)yhackup Adlı Kullanıcıdan Alıntı: [ -> ]
(08-05-2017, Saat: 10:27)SimaWB Adlı Kullanıcıdan Alıntı: [ -> ]Ö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
Bence de mümkün olduğunca with'ten uzak durmakta fayda var
(08-05-2017, Saat: 10:56)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: [ -> ]
(08-05-2017, Saat: 10:43)yhackup Adlı Kullanıcıdan Alıntı: [ -> ]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

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
Doğru söylüyorsunuz, daha az yazalım diye kullanıyorum ara ara ama bırakacağım dediğiniz gibi.
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
(08-05-2017, Saat: 12:41)SimaWB Adlı Kullanıcıdan Alıntı: [ -> ]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

Güzel kullanım aslında her seferinde adını yazmaktansa
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 Documentation Insight gibi bir dökümantasyon aracı kullanarak kodların daha anlaşılır olması sağlanabilir.
Sayfalar: 1 2 3