Selamün Aleyküm;
C++'da sınıflar ve yapılar stack bölgesinde tutulurlar fakat Object Pascal'da sınıflar heap bölgesinde, kayıtlar (record) ise stack bölgesinde tutulurlar. Bu yüzden de Object Pascal'da bir sınıftan bir nesne oluşturduğumuzda bellek yönetimini kendimiz yapmalıyız:
type
TExample = class
...
end;
var
example: TExample;
begin
example := TExample.Create; // -> Heap bölgesinde tutuluyor.
end.
Eğer bu nesneyi bellekten silmezsek bellekte hala yer işgal ettiğini görebiliriz:
Not: C++ için GCC, Object Pascal için de Free Pascal kullanıyorum.
Heap dump by heaptrc unit
1 memory blocks allocated : 8/8
0 memory blocks freed : 0/0
1 unfreed memory blocks : 8
True heap size : 32768
True free heap : 32608
Should be : 32632
Call trace for block $00007F471EF730C0 size 8
(Derleme komutu: fpc -gh test.pas)
Şimdi asıl konumuza gelecek olursak, C++'da sınıflarda operatörleri aşırı yükleme olayını kullanabiliyoruz. Lakin Object Pascal ve Delphi'de sınıflarda operatörleri aşırı yükleme yapamıyoruz, sadece kayıtlarda (record) yapabiliyoruz. Neden sınıflar için operatör aşırı yükleme olmadığına dair şurada açıklama yapmışlar: https://stackoverflow.com/questions/2090472/why-isnt-operator-overloading-available-for-classes-in-delphi
Delphi'de sınıflarda operator overloading olmasının şu nedenlerden ötürü zararlı olacağını söylüyorlar:
Alıntı:
Sınıflarda operator overloading olursa sürekli olarak hafıza sızıntılarına sebep olur. Örnek olarak:
> type
> TExample = class
> private
> memberData: Integer;
> public
> class operator Add(obj: TExample; n: Integer): TExample;
> end;
>
> class operator TExample.Add(obj: TExample; n: Integer): TExample;
> begin
> Result := TExample.Create; // Yeni alan oluşturuyor.
> Result.memberData := obj.memberData + n;
> end;
> ```
>
> Burada example0 := example1 + 5; gibi kullandığımızda + operatörünün yaptığı işlemlerde sürekli yeni alan oluşturuluyor ve bu alanlar silinmiyor. Yani kısaca bellek taşması oluşuyor.
>
diyorlar. Ama bu mantıksız değil mi? C++'da da şöyle yapabiliriz:
Example* example = new Example;
..
delete example; // -> Belleği geri verdik.
Burada da C++ sınıfını heap bölgesinde tutuyor ve elimizle belleği iade etmemiz lazım. Örnek kod:
class Example
{
private:
int _count;
public:
Example();
Example(int count);
int getCount() const;
Example operator+(int c);
};
Example::Example() : _count(0)
{
}
Example::Example(int count) : _count(count)
{
}
int Example::getCount() const
{
return _count;
}
// + Operatörünü Aşırı Yüklüyoruz:
Example Example::operator+(int c)
{
return Example(_count + c);
}
Kullanalım:
// Stack'de tutuluyor:
Example example(75);
example = example + 7;
cout << example.getCount() << endl;
// Heap'de tutuluyor:
Example* ex = new Example(75);
*ex = *ex + 7;
cout << ex->getCount() << endl;
Bu örneği Object Pascal'da record ile şöyle yapabiliyoruz:
type
TExample = record
strict private
_count: Integer;
public
// record'da kurucu fonksiyonlar olmadığı için Getter ve Setter kullanıyoruz:
function getCount: Integer;
procedure setCount(count: Integer);
class operator Add(obj: TExample; n: Integer): TExample;
end;
function TExample.getCount: Integer;
begin
Result := _count;
end;
procedure TExample.setCount(count: Integer);
begin
_count := count;
end;
class operator TExample.Add(obj: TExample; n: Integer): TExample;
begin
Result._count := obj._count + n;
end;
Kullanımı:
var
example: TExample;
begin
example.setCount(75);
example := example + 7;
WriteLn(example.getCount);
end.
Bunda sorun yok ama sınıflarda operator overloading'in bellek taşması sorunu oluşturacağını söylüyorlar ama bir Object Pascal sınıfına Java'da olduğu gibi toplama yapan bir metot da yazabiliriz:
function TExample.add(n: Integer): TExample;
begin
Result._count := _count + n;
end;
E yukarıda record'daki Add operatörü ile bu sınıfta yazdığımız add fonksiyonu aynı kodları kullanıyor. Neden + operatörü varken add diye bir metot yazayım ki? Sizce bu operatör aşırı yükleme konusu Delphi gibi sınıfları heap'de tutulan dillerde olmaması mı yoksa olması mı daha iyi olur? Yani ben bellek tahsisi için bir problem göremiyorum.
Teşekküler.
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]