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.
Yazılım Topluluğumuz -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
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;

http://docwiki.embarcadero.com/Libraries...eJSONValue
http://docwiki.embarcadero.com/Libraries...JSONObject
http://docwiki.embarcadero.com/Libraries...TJSONValue
https://stackoverflow.com/questions/2481...ls-with-ex
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.
Yazılım Topluluğumuz -> Tıklayın
Kişisel Tanıtım Sitem -> Tıklayın
20 y/o, sadece öğrenmeye odaklanmış, insancık..
WWW
Cevapla
#4
Rica ederim, başarılar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [Ödüllü Soru] Object türüne göre nesne üreten fonksiyon Abdullah ILGAZ 0 113 18-05-2020, Saat: 23:22
Son Yorum: Abdullah ILGAZ
  Boş yere free etmeye uğraştığımı düşünüyorum. bibilen 11 711 02-05-2020, Saat: 11:18
Son Yorum: bibilen
  .Net servis, nesne tipi parametre alan metod ... Gürcan 1 440 16-01-2020, Saat: 14:24
Son Yorum: sadettinpolat
  Datasnap free yapmama sorunu. seci20 1 520 24-10-2019, Saat: 08:16
Son Yorum: 3ddark
  Json Free Etmek yhackup 4 1.249 31-07-2019, Saat: 11:17
Son Yorum: Halil Han Badem



Konuyu Okuyanlar: 1 Ziyaretçi