Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Json Free Etmek
#1
Aşağıdaki basit bir procedure 'de oluşan bir memoryLeak vardı ayda binlerce kez çalıştığı için memoryleak'ten şişmemesi için dikkat etmek gerekiyor..

Şimdi aşağıdaki kodu incelersek , her hangi bir memoryLeak'e  fırsat vermediğimi görebilrsiniz.

var
 JSONField: TJSONObject;
 JArray: TJSONArray;
 i: Integer;
 Conn: TMyConnection;
 Query: TMyQuery;
 inSql: String;
begin
 if ConnectionString = '' then
   Exit;

 Conn := TMyConnection.Create(nil);
 Conn.ConnectString := ConnectionString;
 Conn.Connect;
 Query := TMyQuery.Create(nil);
 Query.Connection := Conn;
 JArray := TJSONArray.Create;
 try
   try
     Query.Close;
     Query.Sql.Clear;
     inSql := ifthen(Trim(ModelYil) = EmptyStr, EmptyStr, 'WHERE yil="' + ModelYil + '"');
     Query.Sql.Add('SELECT mkod,marka FROM aracdeger ' + inSql + ' GROUP BY mkod ORDER BY marka');
     Query.Open;
     if not Query.IsEmpty then
     begin
       while not Query.Eof do
       begin
           JSONField := TJSONObject.Create;

         for i := 0 to Query.FieldCount - 1 do
             JSONField.AddPair(Query.Fields[i].FieldName, Query.FieldByName(Query.Fields[i].FieldName).AsString.Replace('\', '/'));

         JArray.AddElement(JSONField);          
         Query.Next;
       end;
     end
     else
       JArray.Add('İstenen Liste Boş');

   except
     on E: Exception do
       JArray.Add(E.Message);
   end;
 finally
   Result := JArray.ToString;

   if Assigned(JArray) then
     JArray.Free;

   if Assigned(Query) then
     FreeAndNil(Query);

   if Assigned(Conn) then
     FreeAndNil(Conn);
 end;
end;


Olmaz ya oldu herhangi bir sebebten dolayı bu kod çalışmadı
JSONField := TJSONObject.Create; 

Yorum satırı haline aldım
          
       // JSONField := TJSONObject.Create;
        for i := 0 to Query.FieldCount - 1 do
            JSONField.AddPair(Query.Fields[i].FieldName, Query.FieldByName(Query.Fields[i].FieldName).AsString.Replace('\', '/'));

        JArray.AddElement(JSONField);   


Normal şartlarda Create olmadığı için AddPair yapamayacak AV hatası fırlatacak, sonrasında finallye düştüğü için tüm objeler free olacak hafızam boşalacak.

Ancak boşalmıyor bu hata fırlıyor.
   

Ben sorunu buldum önlemini aldım, Birazdan paylaşacağım ama öncelikle sizden duyayım, Bu memroyleak sizce neden oluştu ?

Cevap,
AddPair fonksiyonu , kendi nil olsa dahi içeride bir JsonPair Create Ediyor ancak Result := self dediğinde self yani kendisi henüz create olmadığı için atama yapılırken erişmek isteyince AV oluşuyor.


function TJSONObject.AddPair(const Str: string; const Val: string): TJSONObject;
begin
 if (not Str.IsEmpty) then
   AddPair(TJSONPair.Create(Str, Val));
 Result := Self;
end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#2
if assigned(JSONField) then JArray.AddElement(JSONField);
olabilirmi ?
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#3
(10-04-2019, Saat: 15:43)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.if assigned(JSONField) then JArray.AddElement(JSONField);
olabilirmi ?

Değil Smile

Cevap yazdım
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#4
Oraya bakmak hiç aklıma gelmemişti, teşekkürler bilgilendirme için.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#5
Konuyu hortlatmak gibi olmasın ama JSON ile free ederken dikkat edilmesi gereken başka bir nokta owner yapısı. JSON nesneleri birbiri ile kullanınca birbiriyle bağlantılı şekilde çalışıyor ve free etmeye çalıştığımızda karşımıza AV hatası çıkıyordu. 
 
 JSONArray := TJSONArray.Create;
 JSONData := TJSONObject.Create;
 JSONResult := TJSONObject.Create;
try
 JSONData.AddPair('data1', 'value1');
 JSONArray.Add(JSONData);
 JSONResult.AddPair('Result', JSONArray);
 Result := JSONResult.ToString;
finally
 FreeAndNil(JSONData);
 FreeAndNil(JSONArray);
 FreeAndNil(JSONResult);
end;
şeklinde bir kullanım hatalıdır. Bu kullanımda JSONResult nesnesine JSONArray, JSONArray nesnesine ise JSONData bağlantısı olduğu görülüyor. Sadece; 
FreeAndNil(JSONResult);
yapmanız bağlantılı tüm nesneleri silecektir.

İyi çalışmalar.
Yazılım Topluluğumuz -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Kişisel Tanıtım Sitem -> Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
19 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Datasnap free yapmama sorunu. seci20 1 151 24-10-2019, Saat: 08:16
Son Yorum: 3ddark
  Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek LastCoder 6 353 14-10-2019, Saat: 12:11
Son Yorum: sadettinpolat
  Nesneler arasındaki ilşkiyi/bağlantıyı tespit etmek 41linea41 2 248 14-09-2019, Saat: 13:09
Son Yorum: 41linea41
Thumbs Up Json Parse AV Hatası yhackup 0 181 02-09-2019, Saat: 13:27
Son Yorum: yhackup
  XML Json dosyaları ile Çalışma masteryoda 9 2.056 02-08-2019, Saat: 11:20
Son Yorum: TheEAK



Konuyu Okuyanlar: 1 Ziyaretçi