Hata mesajı "Stack overflow"?...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

:D

Bu kural sadettinpolat'ın değil, Delphi'nin bir kuralı. Eğer bir nesne oluşturmuşsanız, bunu yok etme görevi de sizindir. Çeşitli yollarla bu yoketme işi uygulamaya yıkılabilir ama bunu temin etmesi gereken de yine nesneyi oluşturandır.

Kolay gelsin.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

Kural ile Genel kural arasında bu kadar yakın ilişki olduğunu bilmiyordum.
Eminim bu ilişkinin bu kadar yakın olduğunu
class yapısı içerisindeki public, private ayrımını koyanlarla yapıcı ve yokedici fonksiyonların otomatik olarak çalışması gerektiğini kural olarak koyanlarda bilmiyorlardı.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Sayın WARDER,

Yazılanları uzun süredir takip ediyorum Anladığım kadarıyla Create yöntemiyle oluşturulan nesneleri yok etmemize gerek olmadığını savunuyorsunuz ! Peki bunu delphiye bırakmamız Memory Sızıntılarına sebep olmazmı ?

İyi Çalışmalar.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

husonet yazdı:Sayın WARDER,

Yazılanları uzun süredir takip ediyorum Anladığım kadarıyla Create yöntemiyle oluşturulan nesneleri yok etmemize gerek olmadığını savunuyorsunuz ! Peki bunu delphiye bırakmamız Memory Sızıntılarına sebep olmazmı ?

İyi Çalışmalar.
Ben Delphici değilim.
Fakat Class yapısı C++ ile aynı.
C++ gibi her sorumluluğun programcıya yüklendiği bir dilde bile Class yaratılırken yapılan eklemeleri programcı yok etmez. Bu Class kullanmanın bir sonucudur.
Bunun dışında Class ın her neresinde ne yaratıyorsanız yok etmekte sizin görevinizdir.
Örneğin programınızdaki formlara eklediğiniz tüm bileşenleri aslında TForm sınıfının OnCreate sine yüklemişsinizdir. Hiç birisinin yaratılması için ek kod yazmazsınız. Hepsini TForm Sınıfının private bölümünde deklare etmişsinizdir o kadar. Ayrıca bunlar için yok edici herhangi bir kod da yazmazsınız. TForm sınıfı hafızadan atılırken bunlarda otomatik atılırlar. Bu işlem TForm sınıfının sorumluluğudur. Ve en iyi biçimde atılırlar. Programcının hata yapma ihtimalide ortadan kalkar. Sızıntı söz konusu değildir. Tutupta bunları programın herhangi bir yerinde free ederseniz (bu topiği açan arkadaş gibi) sisteme göçük oluşturma ihtimaliniz yüksektir. Bunun aksini iddia etmek abesle iştigaldir. OOP Programlama teknolojisine aykırıdır.
Delphici olmasamda bu işler Delphide de böyle yürüyor nihayetinde.
Burada karışık bir durum yok aslında ama arkadaşlar benim her OnCreate yazdığımı nedense create olarak değerlendiriyorlar. Sonuçta paylaşmaya çalışıyoruz. Kimseyle sorunumuz olmaz olamazda. Bundan memnun olmalıyız diye düşünüyorum.
temiz kodlar.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Merhaba,

2 sene önce Java ile uğraşmıştım Biliyorsunuzdur ki Java da herşey nesnedir. Java da da Garbage_Collector diye işi bitmiş olan nesneleri hafızadan silen bir yapısı vardır. Ve bunuda Java ya bırakılması pek önerilmezdi. Ama bu yapıyı Delphi de duymadım. Peki dil farklılıkları olabilir mi? Genel mantığın aynı olduğunu biliyorum sonuçta türettiğimiz her nesne bir ata sınıftan türetme taki Object sınıfına kadar en ata sınıfta Object bütün nesnelerin Atası ve bildiğim kadarıyla da delphi de özellikle delphi için konuşuyorum Türetilen nesneden önce ki ata nesne yi hafızadan atmamız yanlıştır ama en son türetilen nesnenin Delphi de hafızadan atılması bana göre şarttır.

C++ bildiğinizi söylemişsiniz C++ ile hiç uğraşmadım. Ama bildiğim bir şey var ki ANSI C++ derleyicileri ile türetilen bütün nesneler manuel olarak hafıza ya devredilmelidir. Yani Destructor (Yok edici fonksiyonlar ile) Acaba C++ derleyicisi olarak kullandığınız Tool nedir? Belki de Tool'unuzun bir özelliğinde vardır.


Ayrıca bu tip konuları tartışmak hoş bir durum nede olsa Forumumuzun amacı bu.

Teşekkür Ederim. İyi Geceler.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@warder yazdı:Örneğin programınızdaki formlara eklediğiniz tüm bileşenleri aslında TForm sınıfının OnCreate sine yüklemişsinizdir. Hiç birisinin yaratılması için ek kod yazmazsınız. Hepsini TForm Sınıfının private bölümünde deklare etmişsinizdir o kadar. Ayrıca bunlar için yok edici herhangi bir kod da yazmazsınız. TForm sınıfı hafızadan atılırken bunlarda otomatik atılırlar. Bu işlem TForm sınıfının sorumluluğudur. Ve en iyi biçimde atılırlar.
@husonet yazdı:Genel mantığın aynı olduğunu biliyorum sonuçta türettiğimiz her nesne bir ata sınıftan türetme taki Object sınıfına kadar en ata sınıfta Object bütün nesnelerin Atası ve bildiğim kadarıyla da delphi de özellikle delphi için konuşuyorum Türetilen nesneden önce ki ata nesne yi hafızadan atmamız yanlıştır ama en son türetilen nesnenin Delphi de hafızadan atılması bana göre şarttır.
@warder Parent durumundan yola çıkarak otomatik olarak child nesnelerin free edildiğini bildiriyor... Nesnenin türediği sınıfla değil, hangi nesnenin child'i olduğu önemli.

- @warder'e mantık olarak hak vermemin yanında, şahsen @husonet ve diğer arkadaşlar gibi bir uygulama içerisindeyim.

- Global veya local, kendi create ettiğim her nesneyi free etmeyi ihmal etmemeye gayret gösteriyorum... Bu bana çalışma anında hafıza yönetimi adına çok fayda sağlıyor... (WinME kullandığımdan benim için önem arz ediyor...) Hatta free ederken bile create edilme sırasının tersi sırayla free ediyorum... Parantez mantığı gibi... En son create edilen nesne mümkünse ilk free ediliyor vs.
Resim
Resim ....Resim
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

(eklemeyi unutmuşum. Aktif olarak cpp builder kullanıyorum. )
Bir sınıfın hafızaya yüklenmesi nedir?
Programınızın neresinde çağırırsanız çağırın.
OnCreateyi boşverin herhangi bir yerden çağıdık ve nesne hafızaya yerleşti. Bu ne demektir?
Bu o çağırdığınız sınıfın (sadece değişkenleri konu alalım) barındırdığı değişkenlerin varsa ilk değerlerinin verilip uygun hafıza adreslerine konumlandırılmaları ve bu adreslerin ana programa bildirilerek kullanıma hazırlanmalarıdır. Bu işleri programcı mı yapıyor. tabiki hayır. programcı new dedi (veya delphide karşılığı neyse) iş bitti. kullanmaktan vazgeçtiğinde free veya delete diyecek yine işi bitecek. Ancak bu new ve delete kendi içinde yukarda mini olarak bahsettiğim bir takım süreçler başlatacak. İşte bu süreçlerin new kısmını yapıcı fonksiyon delete kısmını yıkıcı fonksiyon yerine getirir. Bu fonksiyonlar genelde sınıf tanımlamalarına baktığınızda görülmezler. Bu durumda "bak işte yok" demekki böyle bir şey yok dememek lazım. Bu fonksiyonlar sadece programcı bir ek yapacaksa tanımlanır. hatta aşırı yüklemede yapılabilir. Ancak programcı özel bir işlem yaptırmayacaksa tanımlaması gerekmez. Otomatik olarak zaten çalışmaktadır. kitaplarda bu durumu göstermek için yapıcı fonksiyonda mesaj verdirilir. "Merhaba ben yapıcıyım otomatik çalıştım" gibi. aynısı yıkıcı içinde geçerli.
Şimdi bu istediğimiz bir satırda çağırdığımız nesneyi işimiz bitince yok ettik. Peki bu nesnenin içinde kullanılan başka nesneleri kim yaratıp yok ediyor?
Yani bir formda çaşitli nesneler kullandık. TEdit, TComboBox, TListBox vs. Sonra bu formu programımızın içinde herhangi bir yerde kendimiz yaratıp modal kullanıp yok ediyoruz. Görünürde TForm çağırdık ve yok ettik. Peki bununla birlikte kullandığımız o TEdit, TComboBox vs yi kim yarattı ve yok etti.
Benim vurgulanmasını istediğim kısımlar buralarda bulunuyor.
Siz, "ben programcıyım bu formu ben kodla yarattım ve kodla da yok ederim" diyorsunuz. Doğrusu da bu. Siz zincirin ilk halkasından sorumlusunuz. Peki diğerlerini kim yaratıp yok etti.
İşte bunlar otomatik çağrılan yapıcı fonksiyonla hafızaya yerleştirildi ve yine otomatik çağrılan yokedici ile hafızadan en iyi biçimde atıldılar. Üstelik iç içe çağrılan her nesne için ayrı ayrı ve sırasıyla.
İşte ilk başta da (ilk mesajımda) yazdığım yere geldik. OnCreate olayında yaratılan hiç bir şeyin yok edilmeye ihtiyacı yoktur. Eğer önceden (program içinde) yok edilirlerse o zaman program kapatılıp yokedici otomatik çağrıldığında oda aynı şeyleri! yok etmeye çalışacak, yaratılma aşamasında ilk değerleriyle birlikte ana programa bildirilen adreslerde artık o nesneler bulunmadığından bahsettiğim göçük ve çuvalla hata mesajı üretilecektir.
Zaten hata mesajlarına dikkat edilirse tamamı sistem tarafından gönderiliyor. program tarafından değil. Çünkü bahsettiğim yükleme işlemlerini sistem loader ları gerçekleştirmişti. şimdi o adreslerde o nesneler yok. Çünkü programcı önceden yok etti ama bundan programın yokedicisinin haberi olmadı. Tabiri uygunsa programcı yokediciye kazık attı. onu kandırdı. bu noktada benim vurguladığım: programcı bunu yapıyorsa bilerek yapsın. bilmediğinden değil.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

husonet yazdı:Merhaba,

2 sene önce Java ile uğraşmıştım Biliyorsunuzdur ki Java da herşey nesnedir. Java da da Garbage_Collector diye işi bitmiş olan nesneleri hafızadan silen bir yapısı vardır. Ve bunuda Java ya bırakılması pek önerilmezdi.
Diğer mesaj uzun oldu galiba. o yüzden tekrar editlemek yerine yenisini yazıyorum.
Artık .NET teknolojisi ile javadaki çöp toplayıcının benzeri bir uygulama geldi. managed cpp dedikleri durum. sanıyorum delphi 8 de de benzeri bir durum olabilir.
Yani programcı istediğini yaratabilir ama asla yok etmeyle ilgilenmez. Sistem yaratılanların kullanılmadığına karar verdiğinde yok edecek. Kim bilir belki de tüm bu sohbet dizisi yersiz ve eski çağlarda kalmış olacak.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

sayın warder,

amaç konuyu tartışarak doğrusunu öğrenmek, en uygun metodla düzgün, temiz kodlar yazmak. Paylaşımlarınız için teşekkür ederim.

Kolay gelsin.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Paylaşımınız için teşekkür ederim.

İyi Geceler.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

şunu öncelikle söyleyim ki ben warder katılıyorum
OOP matığında C++ da constructor yanında destructor kavramıda var
bir sınıf dizayn edilirken -eğer gerekiyorsa- destructor de yazılır.
mesela bir sınıf içerisinde bir miktar hafıza ayırtılıp -alloc- bir pointera
atandıysa sınıf yok edildiğinde ayrılan kısmın free edilmesi için kod destructor
da yazılması gerekir. her tasarlanan sınıf bu şekilde yapılırsa bir problem olmaz

yani
Her Nesne kendi temizliğini kendisi yapar
Lakin başta ben olmak üzere çoğu kimse OOP library üzerinde yapısal programlama yapıyor. -yarı-OOP mi deseydim - Daha pratik olduğundan bu durumda

sadettinpolatın dediği geçerli oluyor
herkes kendi oluşturduğu nesneyi yok etmekle sorumludur.
Cevapla