Aslında bu mesaj bayağı anlamsız çünkü bunları ben de daha hiçbir yerde yazmamıştım. Şu sıralarda yazmakta olduğum "Bellek Yönetimi" dersi sırasında günlerdir akıcı bir biçimde anlatmaya debelendikten sonra sınıf, yapı ve birlikler içinde tanımlanan new ve delete'in emekliye ayrıldıklarını öğrendim.
Bir yandan emek harcadığıma üzüldüm, bir yandan da yazacak konular azaldı diye sevindim. :)
Ek olarak, bu konuların günlük programlama için önemli olduklarını düşünmenizi istemem. C++'ta da bulunan benzer olanakları (operator new ve operator delete) ne kullandım ne de kullanıldığı projede çalıştım.
Bunlar belirli bir türün nesneleri için gereken yeri belirlemek ve o yeri geri almak için kullanılıyordu.
Örneğin Sınıf türünün bütün nesnelerinin bellekteki yerleri aşağıdaki gibi new ve delete ile yönetilebiliyordu (aslında 2.053'te bile hâlâ etkin):
import std.stdio;
import core.memory;
class Sınıf
{
string s;
int i;
/* Yeni bir nesne için gereken belleği ayırır ve döndürür */
new(size_t uzunluk)
{
writefln("Sınıf.new'den istenen bellek bölgesi uzunluğu: %s bayt",
uzunluk);
/* İstenen belleği herhangi bir biçimde elde edebiliriz. Ben çöp
* toplayıcıdan alıyorum: */
void * adres = GC.calloc(uzunluk);
writefln("Sınıf.new, %s adresini döndürüyor", adres);
return adres;
}
/* Sonlandırılmış olan bir nesnenin belleğini geri almaya yarar */
delete(void * adres)
{
writefln("Sınıf.delete, %s adresi ile çağrıldı", adres);
/* Burada belleğin işinin bittiğini biliyoruz; geri alabiliriz ama
* ben bu konuyu burada gözardı ediyorum. */
}
}
void main()
{
auto nesne = new Sınıf;
writefln("main içindeki nesne.s'nin adresi: %s", &(nesne.s));
writefln("main içindeki nesne.i'nin adresi: %s", &(nesne.i));
delete nesne; // <-- Bu anahtar sözcük de emekliye ayrıldı;
// yerine tam karşılığı olmasa da clear() kullanılıyor
}
Çıktısı (adresler her çalıştırışta farklı olacaktır):
'Sınıf.new'den istenen bellek bölgesi uzunluğu: 36 bayt
Sınıf.new, 7F077E83F980 adresini döndürüyor
main içindeki nesne.s'nin adresi: 7F077E83F990
main içindeki nesne.i'nin adresi: 7F077E83F9A0
Sınıf.delete, 7F077E83F980 adresi ile çağrıldı
'
Onların yerine nesneyi belirli bir yerde kurmak için artık std.conv.emplace var. Bu durumda nesneler new ile değil, aşağıdaki gibi yeni_Sınıf() gibi bir işlevle oluşturulabilirler:
import std.stdio;
import core.memory;
import std.conv;
class Sınıf
{
string s;
int i;
}
Sınıf yeni_Sınıf()
{
size_t uzunluk = __traits(classInstanceSize, Sınıf);
writefln("Sınıf için gereken bellek bölgesi uzunluğu: %s bayt",
uzunluk);
void * adres = GC.calloc(uzunluk);
writefln("nesne, %s adresinde kuruluyor", adres);
Sınıf nesne = emplace!Sınıf(adres[0..uzunluk]);
return nesne;
}
void main()
{
auto nesne = yeni_Sınıf();
writefln("main içindeki nesne.s'nin adresi: %s", &(nesne.s));
writefln("main içindeki nesne.i'nin adresi: %s", &(nesne.i));
}
Çıktısı:
'Sınıf için gereken bellek bölgesi uzunluğu: 36 bayt
nesne, 7FCD18E14980 adresinde kuruluyor
main içindeki nesne.s'nin adresi: 7FCD18E14990
main içindeki nesne.i'nin adresi: 7FCD18E149A0
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]