Forum: D Programlama Dili RSS
delete değil, clear
Page:  previous  1  2 
acehreli (Moderator) #16
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
In reply to post ID 2537
Ne yazık ki olmaz; çünkü daha nesne sonlandırılmadan belleğinin geri verilmesini istiyorsun. Sonlandırıcı işlev geçersiz bellek üzerinde tesadüfen çalışıyor.

Bir kaç writeln ile:

import std.stdio;
import core.memory;
void main()
{
    class deneme
    {
        this()
        {
            writeln("this()");
            File dosya = File("ogrenci_bilgisi", "a");
            dosya.writeln("İsim  : ", "Zafer");
            dosya.writeln("Numara: ", 123);
            dosya.writeln("Sınıf : ", "1A");
        }
        ~this()
        {
            writeln("~this()");
            File dosya = File("ogrenci_bilgisi", "a");
            dosya.writeln("Bozucu :İsim  : ", "Zafer");
            dosya.writeln("Bozucu :Numara: ", 123);
            dosya.writeln("Bozucu :Sınıf : ", "1A");
        }
    }
    auto örnek = new deneme();
    writeln("GC.free öncesi");
    GC.free(&örnek);
    writeln("GC.free sonrası");
    
}

Çıktısı:

this()
GC.free öncesi
GC.free sonrası
~this()

Görüldüğü gibi, çöp toplayıcı sonlandırıcıyı yine de kendisi çağırıyor ama bellek geri verildikten sonra...

Ali
canalpay (Moderator) #17
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
GC.free ne işe yarıyor ki o zaman ?

Sanırım C'nin çözümlerine başvurmak zorundayız ? Açıkça böyle bir şey olamaz. Ben D için C'nin şeylerine bulaşmayı istemiyorum. O zaman kısadan C yazsam daha iyi.

Bu listelerde uzunca tartışılmış : http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Tartışmanın devamı: http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Andrei şunu önermiş : (Denemedim ki zaten şuan çalışmaz.)

void[] AllocateStuff(size_t size);
void DeallocateStuff(void* p);

Then you'd write these two helper functions to create and dispose objects:

T * myMake(T)() if (is(T == struct))
{
     auto buf = AllocateStuff(T.sizeof);
     return emplace!T(buf);
}

T myMake(T)() if (is(T == class))
{
     auto buf = AllocateStuff(__traits(classInstanceSize,T));
     return emplace!T(buf);
}

void myDelete(T)(T p)
{
     clear(p);
     DeallocateStuff(p);
}

Aslında bu durum ptDDev dediği gibi bir durum. Gıcıkca buna zorlanmayacağız umarım. Eğer istenmiyorsa delete bu kadar bir kütüphane olanağı haline gelsin ? Bu kadar zorlamaya gerek var mı ?

Şuan anladığım kadarıyla delete giderse yerine onu tutacak hiç bir şey yok.
acehreli (Moderator) #18
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ben de çöp toplayıcılı dillerde deneyimli değilim ama bu kadar insan bu kadar dili kullandığına göre demek ki çalışıyor... :)

Hatırlayalım: Öncelikle, hiçbir şey yapmamıza gerek yok. Eğer hemen işletilmesi gereken bir işlem varsa, onu sonlandırıcı işleve yazmak zorunda değiliz. Hatta sınıf yapmak zorunda da değiliz. Yapı nesneleri hemen sonlandırılıyorlar. Sınıf nesneleri de scope ile işaretlenince hemen sonlandırılıyorlar.

clear'i çağırmanın gerekmesi nadir bir durum. Öyle nadir durumlarda da, sonlandırıcı işlevin önemli bir işlem yapmasını önleyebiliriz.

Ali
canalpay (Moderator) #19
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Bana göre clearı çağırdığımızda bir daha sonlandırıcı ile çağrılmaması için not bırakılmalı. Ve bence druntimeın şuan  ki geliştiricileri(özellkle sean kelly) çöp toplayıcıya hakim değil diye düşünüyorum :-) Bu yüzden kendilerine gereksiz yük yüklemek istemiyorlar diye düşünüyordum. Ancak bu karışıklık belki programı yavaşlatacak bazı hatalara sebep olacaktır. Ama hala çöp toplama ile ilgili bir hata vardı ve yeniden yazılacaktı. Ne oldu merak ettim.

Bende bazı şeyler denerken Ali Bey ile c++ de sınıflar ile ilgili konuştuğumuz bir olayı(not bırakma olayını)  cleara  eklemek istedim ve basit bir örnek yazdım:
import std.stdio;
 
void main()
{
    class selam
    {
        static bool değişti_mi=!bool.init;
        char[] sa="selamun aleyküm".dup;
        char[] as="aleyküm selam".dup;
        
        this()
        {
            if(değişti_mi){
            
            writeln(sa);
            writeln(değişti_mi);
            }
        }
        ~this()
        {
            if(değişti_mi){
            writeln(as);
            değişti_mi=bool.init;
            writeln(değişti_mi);
            }
        }
    }
    
    auto sel = new selam;
    
    clear(sel);
    
}

Bu notu bir biçimde clear kendi yapamaz sanırım?

Eğer clear hepsine gereksiz anlamında özel bir değer verebilirse if ile direk onu kontrol eden basit bir işlevde yazılırsa bu yukarıdakinden daha iyi bir çözüm olabilir?
acehreli (Moderator) #20
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by canalpay:
Bana göre clearı çağırdığımızda bir daha sonlandırıcı ile çağrılmaması için not bırakılmalı.

Şu anda devam eden "crystal clear()" başlıklı konuda da ondan konuşuyorlar. Sonlandırılmış olan nesnenin 'vptr'larını silmekten bahsediyorlar. (vptr, her türün değişik davranması için her türde override ile farklı tanımlanmış olan çok şekillilik işlevlerini barındıran tablo gösterdesidir. "Virtual function table pointer"dan gelir.)

Yani sonunda clear()'in her durumda nasıl doğru çalışacağını anladılar galiba. :)

Tekrar söylemek gerekirse, ben bu çabalarını doğru buluyorum. clear() yalnızca nesneyi sonlandırmalı; nesnenin oturduğu belleğin ne olacağı bizi ilgilendirmemeli.

Ve bence druntimeın şuan  ki geliştiricileri(özellkle sean kelly) çöp toplayıcıya hakim değil diye düşünüyorum :-)

Çöp toplayıcı çok özel bir konu olduğu için doğru olabilir; ama ben kendisini çok beğeniyorum.

Ama hala çöp toplama ile ilgili bir hata vardı ve yeniden yazılacaktı.

Farklı yaklaşımlı bir çöp toplayıcı geliştiriliyor diye biliyorum.

    class selam
    {
        static bool değişti_mi=!bool.init;

Ama o herhalde static olmayacak, değil mi. Yoksa selam türünün bütün nesneleri tek değişti_mi'yi paylaşırlar. Onun değerini birisi değiştirse, hepsi etkilenmiş olur. O yüzden bence o static olmamalı.

Bu notu bir biçimde clear kendi yapamaz sanırım?

Güzel düşünüyorsun. Evet, yapabilir. Her nesnenin boyu bu iş için bir bool kadar büyümesin diye de vptr'ı temizleme yolunu düşünüyorlar. Daha etkin ama sonuçta aynı mantık: not bırakmak. Hem sonlanmış bir nesnenin hiçbir işlevinin çağrılması da beklenmeyeceği için vptr'ına ihtiyacı da yoktur.

Ali
canalpay (Moderator) #21
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Tekrar söylemek gerekirse, ben bu çabalarını doğru buluyorum. clear() yalnızca nesneyi sonlandırmalı; nesnenin oturduğu belleğin ne olacağı bizi ilgilendirmemeli.

Tamamen doğru buluyorum. Artı bence sadece bir kere sonlandırıcı çağrılmalı.

Ama o herhalde static olmayacak, değil mi. Yoksa selam türünün bütün nesneleri tek değişti_mi'yi paylaşırlar. Onun değerini birisi değiştirse, hepsi etkilenmiş olur. O yüzden bence o static olmamalı.

Evet static olmamalı. Ancak o zaman her nesneye erişim sağlandığında eğer static ile erişilmez ise tekrar değişken kuruluyor. Uzatmayayım. static'i kaldırdığınızda anlayacaksınız : http://ideone.com/Spkm3

Çöp toplayıcı çok özel bir konu olduğu için doğru olabilir; ama ben kendisini çok beğeniyorum.

Bende çöp toplayıcıyı çok beğeniyorum. Sadece dmd'ninki daha iyi yazılabilir miydi diye merak ediyorum.

Bence bu konular eğlenceli konular. Biraz daha düşünmeliyiz. Güzel şeyler bulabiliriz.
acehreli (Moderator) #22
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by canalpay:
Evet static olmamalı. Ancak o zaman her nesneye erişim sağlandığında eğer static ile erişilmez ise tekrar değişken kuruluyor.

Evet, static olmadığında bütün üyeler clear() tarafından ilk değerlerini aldıkları için bizim değişkenin değeri de false oluyor.

Bu bilginin her nesne için ayrı olarak tutulması gerekiyor ama tabii normalde bizim uğraşmamız gerekmemeli.

Ali
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2 
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 11:49:08 (UTC -08:00)