Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Nesne Neden Free Olmuyor?
#1
Selamlar,

function THHBClass.readJSONData(JSONData: string; DataValue: String;
  arrayName: string = 'Result'; arrayIndex: Integer = 0): String;
var
  JSONRead: TJSONObject;
begin
  JSONRead := TJSONObject.Create;
  try
    JSONRead := JSONRead.ParseJSONValue(JSONData) as TJSONObject;
    Result := JSONRead.GetValue<string>(arrayName + '[' + arrayIndex.ToString +
      '].' + DataValue);
  finally
    FreeAndNil(JSONRead);
  end;
end;


Yukarıdaki fonksiyon benim oluşturmuş olduğum "elimin altında bulunması gerekenler" adı altında bulunan bir sınıfımdan. Bu fonksiyon MemoryLeak vermekte. FreeAndNil ile Create ettiğim nesneleri yok ediyorum lakin program sonunda MemoryLeak alıyorum. Görmediğim, bilmediğim bir kısım mı var?


nbWVR5.png

Yardımcı olursanız sevinirim,
Teşekkürler,
İyi çalışmalar.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#2
Selamlar;

Aşağıdaki satır ile bir TJSONObject instance'ı oluşturuyorsunuz;
JSONRead := TJSONObject.Create;

Sonraki satır olan aşağıdaki satırda ise, bir class function olan ParseJSONValue fonksiyonu TJSONValue instance'ı dönüyor.
JSONRead := JSONRead.ParseJSONValue(JSONData) as TJSONObject;

Yukarıdaki iki satırda da birer nesne instance'ı oluşuyor ve aynı referansa set ediliyor. Bu durumda ilk oluşturulan instance'a işaret eden bir referans kalmıyor. FreeAndNil satırında ikinci instance free ediliyor ancak ilk instance bellekte kalıyor, leak olan nesne sizin ilk satırda oluşturduğunuz instance. Kodu aşağıdaki gibi düzenlediğinizde sorun olmamalı, (test etmedim, browser'da düzenledim.) ayrıca ParseJSONValue fonksiyonunun exception fırlatması durumu da handle edilmeli.
function THHBClass.readJSONData(JSONData: string; DataValue: String;
 arrayName: string = 'Result'; arrayIndex: Integer = 0): String;
var
 JSONRead: TJSONValue;
begin
 JSONRead := TJSONObject.ParseJSONValue(JSONData);
 try
   if JSONRead <> nil then
     Result := JSONRead.GetValue<string>(arrayName + '[' + arrayIndex.ToString + '].' + DataValue);
 finally
   FreeAndNil(JSONRead);
 end;
end;

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#3
Teşekkür ederim üstad,
Bende şu satırdan şüphelenmiştim;
JSONRead := JSONRead.ParseJSONValue(JSONData) as TJSONObject;
Create ettiğim nesneye ek olarak class tanımlamak ve set edince problem oralarda dedim fakat tam olarak nedenini anlamamıştım.
Denedim MemoryLeak vermeden işlemi tamamladım.
Tekrardan teşekkür ederim.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#4
Rica ederim, başarılar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Json Free Etmek yhackup 4 490 31-07-2019, Saat: 11:17
Son Yorum: Halil Han Badem
  Free Pascal'da AVLTree onurcan1977 2 420 08-06-2019, Saat: 18:22
Son Yorum: onurcan1977
  Fastreport nesne kontrolu ve veri yazma cinarbil 3 395 18-04-2019, Saat: 08:16
Son Yorum: cinarbil
Lightbulb OCR Space - Free OCR API ( Ticari Serbest, Günde 500, ayda 25000 Sorgu ücretsiz ) mrmarman 6 654 12-02-2019, Saat: 09:38
Son Yorum: mrmarman
  Layout içindeki nesne sayısı nehirnnn 4 577 28-10-2018, Saat: 19:36
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi