Tstrings Free edilmeli mi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Tstrings Free edilmeli mi

Mesaj gönderen Lord_Ares »

Merhaba, sürekli kullandığım bir prosedürde merak ettiğim ve bilmediğim birşey farkettim ve sizlerin yardımıyla bunun doğrusunu öğrenmek isterim.
Prosedürde LS isminde TStrings tipinde bir değişkene, yapılan aramanın sonuçları aktarılıyor. LS değişkeni başta create edilmemiş ve işlem sonunda da Free edilmemiş. Bu doğru bir kullanım mı ? Free edilmediği için hafızada yer kaplamaz mı ? Doğru değilse nasıl kullanmalıyım
Teşekkürler

Kod: Tümünü seç

procedure Klasorleri_Yukle(LS:TStrings; AnaDizin:String; KarsilaDizin:String; Harf:string;Filtre:boolean);
        function Buyuk_Harf_Yap(Str:String) : String;
        Const
          buyukharf:String='ÇĞIİÖŞÜ';
          kucukharf:String='çğıiöşü';
        Var
          I :Integer;
          NewStr:String;
        Begin
          NewStr:='';
          For I:=1 To Length(Str) Do
           if Pos(Str[I],kucukharf)>0 Then
              NewStr:=NewStr+buyukharf[Pos(Str[I],kucukharf)]
           Else
              NewStr:=NewStr+UpperCase(Str[I]);
          Result:=NewStr;
        End;
var
   SR: TSearchRec;
   IsFound, IsFound1: Boolean;
   dosya,gecici,dosya_adi: string;
   i: integer;
begin
   LS.Clear;
   if AnaDizin[length(AnaDizin)] <> '\' then
      AnaDizin := AnaDizin + '\';
   IsFound :=FindFirst(AnaDizin + '*.*', faDirectory, SR) = 0;
   while IsFound do
   begin
       if Filtre=True then begin //filtre var
                           if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
                             begin

                               dosya_adi:=Buyuk_Harf_Yap(sr.Name);
                               Harf  := Buyuk_Harf_Yap(Harf);
                               gecici:= AnsiLeftStr(dosya_adi,1);

                               if Harf<>'' then
                                  begin
                                     if gecici=harf then
                                        begin
                                            Ls.AddObject(SR.Name , TYoluItem.Create(AnaDizin));
                                            dosya_adi:='';
                                            gecici:='';
                                        end;
                                   end; //
                             end;
                            end; //

       if Filtre=false then begin //filtre yok
                              if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
                               begin
                               if not DirectoryExists(KarsilaDizin+SR.Name) then
                                  begin
                                     Ls.AddObject(SR.Name , TYoluItem.Create(AnaDizin));
                                  end;

                               end;
                            end;
   IsFound := FindNext(SR) = 0;
   end;
   FindClose(SR);
end;
////////////////////////////////////////////////////////////////////

Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Tstrings Free edilmeli mi

Mesaj gönderen adelphiforumz »

bildiğim kadarı ile nesne procedure çağrılırken atandığı için atanan nesnenin referansını kullanılyor.
eğer procedure sonunda free edilirse çağıran yerdeki nesnede kaybolur.
eksik yada yanlış biliyor olabilrim fakat benim bildiğim bu
doğru olduğunu düşündüğüm kullanım ise gelen
nesne procedure içinde başka bir nesneye create edilip atanır
bu nesne ile çalışıp procedure bitmeden asıl nesneye taşınır ve
procedure içinde oluşturulan nesne free edilir.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Tstrings Free edilmeli mi

Mesaj gönderen Lord_Ares »

Cevap için çok teşekkürler. Buradan şunu anlıyorum , herhangi bir (TStrings türevi listbox, memo vs gibi ) nesne ile kullanıyorsak gerek yok, prosedür içinde değişken olarak kullanıyorsak prosedür sonunda yok etmeliyiz. Anladığım doğrumudur.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Tstrings Free edilmeli mi

Mesaj gönderen ertank »

Merhaba,

Çalışma zamanında oluşturulan TStrings kullanımı bittiği noktada Free edilmeli. Bu anlamda sorunuzun tek bir doğru cevabı yok aslında. Eğer dışarıdan parametre olarak gelen TStrings prosedür veya fonksiyon içinde kullanılıp işi bitmiş olacak ise orada Free edilmeli. Eğer kullanımı devam edecek ise edilmemeli.

Uygulamanızın hafıza kaçağı yapıp yapmadığını takip etmek açısından proje dosyasının (Project->View Source menü seçeneği) ilk satırına aşağıdaki ifadeyi eklerseniz uygulama kapatıldığı zaman *eğer kaçar varsa* size rapor gösterir. Kaçak yoksa bir mesaj gelmez.

Kod: Tümünü seç

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;  //  <-- kaçak olduğunda haber almak için
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Eğer müşterilerinizde bu tür mesaj çıksın istemiyor iseniz aşağıdaki şekilde kullanmanız da mümkün. Böylece sadece DEBUG tanımı aktif iken raporlama yapar. Yeni nesil Delphi sürümlerinde Build Configuration ayarı RELEASE olduğunda raporlama yapmaz. Delphi 7 için ise siz manuel tanımı kaldırabilirsiniz.

Kod: Tümünü seç

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
{$DEFINE DEBUG}  // <-- Delphi 7 için bu şekilde tanım yapıp kullanabilirsiniz. Daha sonra son derleme öncesi sadece bu tanımı kaldırıp derleyebilirsiniz.
{$IFDEF DEBUG}  // <-- sadece DEBUG tanımlı iken çalışır
  ReportMemoryLeaksOnShutdown := True;
{$ENDIF}
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tstrings Free edilmeli mi

Mesaj gönderen freeman35 »

Değişken ve create işini bir birine karıştırıyorsunuz. Create memoryden bir alanı blocklar ve buraya o nesne class ne ise onun için ayırır. memory tüm işletim sistemi için bu mantıkla çalışır. yani hafıza hiçbir zaman boş değildir. Şimdi, siz size ait olan bir bloğu nasıl bulabilir siniz? Örneği şu çocuklar için bir havuza atılmış yüzlerce topu düşünün, bunlardan biri size ait nasıl bulabilir siniz? size ait olana bir işaret sayı veya isim vererek değil mi? yada mektup gönderdiniz nereye gidecek en doğru şekilde? adres sayesinde.
İşte o adres dediğiniz şey variable, değişken. değişken denmesindeki amaç, bu adresin istendiği zaman değiştirebileceğidir. Bunu bir kutuyada benzetebilirsiniz. Kutu değişken, içindeki ise adres. Bu adrese pointer dediğinizde Türkçe karşılığıda noktacı gibi birşey, yani o bloğun noktası. Ben ona kulağıda derim :) O bloğu tutabileceğiniz kulağı ki kaçamasın bir yere.
Değişkenleri yani kutuları çoğaltabilirsiniz, ama blok sadece bir tanedir, bu bloğu N tane değişkene atayabilirsiniz, hepsi aynı kulağı çeker :)
Create ettiğiniz Free etmek zorundasınız, ama nerede nezamanı programcının kullanımına göre değişir. Ama Askerlik yapanlar bilir, her elektrik düğmelerinde şöyle bir şey yazar "Gereksizse söndür" :D
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Tstrings Free edilmeli mi

Mesaj gönderen xozcanx »

freeman35 yazdı:Değişken ve create işini bir birine karıştırıyorsunuz. Create memoryden bir alanı blocklar ve buraya o nesne class ne ise onun için ayırır. memory tüm işletim sistemi için bu mantıkla çalışır. yani hafıza hiçbir zaman boş değildir. Şimdi, siz size ait olan bir bloğu nasıl bulabilir siniz? Örneği şu çocuklar için bir havuza atılmış yüzlerce topu düşünün, bunlardan biri size ait nasıl bulabilir siniz? size ait olana bir işaret sayı veya isim vererek değil mi? yada mektup gönderdiniz nereye gidecek en doğru şekilde? adres sayesinde.
İşte o adres dediğiniz şey variable, değişken. değişken denmesindeki amaç, bu adresin istendiği zaman değiştirebileceğidir. Bunu bir kutuyada benzetebilirsiniz. Kutu değişken, içindeki ise adres. Bu adrese pointer dediğinizde Türkçe karşılığıda noktacı gibi birşey, yani o bloğun noktası. Ben ona kulağıda derim :) O bloğu tutabileceğiniz kulağı ki kaçamasın bir yere.
Değişkenleri yani kutuları çoğaltabilirsiniz, ama blok sadece bir tanedir, bu bloğu N tane değişkene atayabilirsiniz, hepsi aynı kulağı çeker :)
Create ettiğiniz Free etmek zorundasınız, ama nerede nezamanı programcının kullanımına göre değişir. Ama Askerlik yapanlar bilir, her elektrik düğmelerinde şöyle bir şey yazar "Gereksizse söndür" :D
Hocam bu konu defalarca konuşuldu yorumlar ve açıklamalar yapıldı, Hepsini sıramaya koysak sanırım bunun üstüne bir açıklama olmaz :D
Kulağı tutmak,ışığı söndrümek daha nasıl anlatılabilir ki :)
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Tstrings Free edilmeli mi

Mesaj gönderen Lord_Ares »

"Gereksizse söndür" :D
freeman35 :N) :bravo:
Ertank paylaşamınız için çok teşekkürler deneyip inceliyorum hemen.

Arkadaşlar emiğinize sağlık bu güzel açıklamalar için çok teşekkürler.
Cevapla