TList ve FreeMem

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

TList ve FreeMem

Mesaj gönderen ikra »

Kod: Tümünü seç

TData = record;
PData = ^TData;

procedure AddData(Data: PData);
begin
  FList.Add(Data);
end;

procedure RemoveData(Data: PData);
begin
  FList.Remove(Data);
  FreeMem(Data);
end;

procedure ButtonClick(Sender: TObject);
begin
  RemoveData(FList.Last);
end;
Selamun aleykum...
butona bastigimda FreeMem fonksyonu SizeOf(PData) büyüklügündeki veriyi mi bellekten siler yoksa SizeOf(Pointer) mi?
illede RemoveData(PData(FList.Last)); yapmam gerekir mi? evet ise FList.Last'in döndürdügü pointer ile PData'nin pointeri bir degil mi dir?

degerli vaktiniz icin simdiden tesekkür ederim.
kıdemsiz üye
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: TList ve FreeMem

Mesaj gönderen sabanakman »

AddData ile eklenen bilgi bellek üzerinde nasıl oluşturuluyor bundan bahsedilmemiş. GetMem kullanıyorsanız FreeMem ile de yok edebilirsiniz. New ile oluşturuyorsanız Dispose ile yok etmekte fayda olacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TList ve FreeMem

Mesaj gönderen ikra »

New ile create ediyorum.

Peki Dispose ile FreeMem arasindaki fark ne dir?
Dispose dememin bana faydasi ne olacaktir?

google diyor ki, getmem-freemem ve new-dispose kardestirler.
iki kardesi birbirinden ayirma.
sonu pek hayrli olmaz.
ama dogru düzgün aciklama yok.
kıdemsiz üye
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: TList ve FreeMem

Mesaj gönderen sabanakman »

Kardeş demek yerine aynı dili konuşuyorlar dersek daha iyi olur sanırım. Mesela, alt yapılarını hiç bilmem ama tahminime göre bellekteki bilginin boyutuyla alakalı farklı yöntem kullanıyor olabilirler. Bu bilginin de, yok edilme esnasında doğru olarak biliniyor olması lazım ki bu işlev sağlıklı çalışsın.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: TList ve FreeMem

Mesaj gönderen ikra »

peki Dispose(FList.Last) ile Dispose(PData(FList.Last)) ayni seyi ifade eder mi?
TypeCast yapmam gerekir mi?
isin tembelliginde degilim elbet. En dogru olani bilmek istiyorum. Eger her ikisi de dogru ise, iki alternatifin de dogru oldugunu bilmek istiyorum.
cok mu sey istiyorum : ))
kıdemsiz üye
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: TList ve FreeMem

Mesaj gönderen SimaWB »

Pointer sadece belirli bir adresi temsil eder. Yani o adresin içeriğiyle ilgilenmez. O adreste ve sonrasında hangi bilgi var onu bilemez. Dolayısıyla;
SizeOf(PData), SizeOf(Pointer), SizeOf(PByte), SizeOf(PInteger) ...
hep aynı değerdedirler, o değer de 4 yada 8'dir. İşletim sistemi 32 bit ise 4 (4 byte), 64 bit ise 8 (8 byte).
There's no place like 127.0.0.1
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2382
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: TList ve FreeMem

Mesaj gönderen freeman35 »

niye kimse help e bakmaz, niye biraz dahi araştırma yapmadan illaki aklına geleni birilerine sorma zorunluluğu duyar. heleki bizde buna mecburmuşuz gibi sitem, laf ederler.
Sizeof() parametre ne gönderirsen onun boyutunu verir, değişken tipini verirsen o tipin boyutuu verir, delphi içinde Sizeof yazıp üzerinde "F1" e basıp en tepel PASCAL function bilgilerini ulaşın
getmem ile açtığını freemem le vermen gerek, bu eski pascal komutları, heap memory kullanabilmek için gerekirlerdi, DOS zamanında 640kb üstüne erişebilmek için
new ile aldığını dispose ile vermen gerek. buda heapmem içindi
fark: get-free mem de boyut belirlenir. new-dispose da boyut parametre gönderilen değişkenin kullandığı kadardır,derleyici belirler denebilir.
pointer -> http://translate.google.com/#auto/tr/pointer
memory yi havuza benzertin, değişkeninizde bir kap, buna isim verdiniz FData, data yada amet memet, bu kapın tutabilmeniz için bir SAPı olmalı, o sapın ingilizce adı "pointer"
pointer da bir integer değişkendir. ctrl + left clik le değişkeni takip ederseniz nereye gittiğini takip ederseniz, daha çokta ÖĞRENME iç güdüsünü tetikleyen MERAK olunca, insan öğrenir.

Alıntılar aşağıdadır,

yüce google a soru "delphi getmem" çıkan ilk cevap "http://www.delphibasics.co.uk/RTL.asp?Name=GetMem"
yüce google a soru "delphi new" çıkan ilk cevap "www.delphibasics.co.uk/RTL.asp?Name=New"

Delphi XE2 editör ünherhangi bir yerine sadece getmem yazıp üzerine F1 e basılınca çıkan sonuçlar 4 adet (topic-> konu) bunlardan "System.GetMem" aşağıdadır

System.Getmem
Description
GetMem allocates a memory block.

GetMem allocates a block of the given Size on the heap, and returns the address of this memory in the P parameter. The bytes of the allocated buffer are not set to zero. To dispose of the buffer, use FreeMem. If there is not enough memory available to allocate the block, an EOutOfMemory exception is raised.

Note: If the memory block must be initialized with zero, you can use AllocMem.
This function is not available in C++. In C++ you can use GetMemory.

In case of a typed pointer, you should consider the New and Dispose procedures, which respectively initialize and finalize the memory block accordingly.

Buda New için HELP-> Yardım
System.New

Description
Creates a new dynamic variable and sets P to point to it.

In Delphi code, the New procedure creates a new dynamic variable and sets a pointer variable to point to it. P is a variable of any pointer type. The size of the allocated memory block corresponds to the size of the type that P points to. The newly created variable can be referenced as P^. If there is not enough memory available to allocate the dynamic variable, an EOutOfMemory exception is raised.

When an application is finished using a dynamic variable created with New, it should dispose of the memory allocated for the variable using the Dispose standard procedure.

See Also

Aşağıda Delphi 2007 help inden alıntıdır
File
System

Description
GetMem allocates a block of the given Size on the heap, and returns the address of this memory in parameter P. The bytes of the allocated buffer are not set to zero. To dispose of the buffer, use FreeMem. If there isn't enough memory available to allocate the block, an EOutOfMemory exception is raised.

Note: If the memory needs to be zero-initialized, use AllocMem instead.


Delphi Examples:


Aşağıdaki alıntı Lazarus Help inden alıntıdır

Description
Getmem reserves Size bytes memory on the heap, and returns a pointer to this memory in p. What happens if no more memory is

available, depends on the value of the variable ReturnNilIfGrowHeapfails: if the variable is True then Nil is returned. If the variable is False, a

run-time error is generated. The default value is False, so by default an error is generated.
The newly allocated memory is not initialized in any way, and may contain garbage data. It must be cleared with a call to FillChar or FillWord.

For an example, see Freemem.
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 !!!
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: TList ve FreeMem

Mesaj gönderen omurolmez »

TList yerine TObjectList kullanabilirsiniz. Böylece record yerine class olarak tanımlayabilirsiniz verinizi. Bu durumda eğer ownObject true derseniz. TObjectList gereken Free çağrılarını yapar.
Ömür Ölmez
Cevapla