Merhaba Hasan ,
Konu senin bildigin gibi yani new ile ornekledigimizde bellekte yer edeniyorlar.
Ornekte verdigin kodun davranisi "undefined behaviour" diye adlandiriliyor. Yani her an her sey olabilir. Bellekte onemli bir yere denk gelirse patlayabilir.
Sen soruyu sorduktan sonra biraz arastirdim, burda modern derleyiciler Foo sinifi sanal bir fonksiyonu olmadigindan dolayi v-table 'a ihtiyaci olmadigindan ve bir uye degiskene ulasmadigindan dolayi asagidaki "uye fonksiyonu" , "serbest fonksiyona" ceviriyormus. Yani "this" gostericisini aradan cikartiliyormus. Bu durumda p->f() aslinda f() donusturuluyormus.
https://stackoverflow.com/questions/2533476/what-will-happen-when-i-call-a-member-function-on-a-null-object-pointer
Uye degisken erisimi ekledigim anda:
using namespace std;
#include <iostream>
class Foo{
public:
Foo(int i=0){ _i=i;}
void f(){
std::cout<<"Foo::f()"<< _i <<std::endl;
}
Segmentation fault aliyorum.
**Gerisi biraz detay ben yazmak istedim bildigimi dusundugum bir konuyu vakit kaybetmemek icin atlayabilirsin:
"This" gostericisini atlamaktan kastim:
class Foo
{
void f();
}
Dedigimizde aslinda derleyici aliyor bunu
void f( Foo* this);
e ceviriyor. Sinif dedigimiz sey aslinda yok ekvator cizgisi gibi birsey. Sonucta bildigimiz bir fonksiyon cagrisi oluyor. Akilli derleyici "this" kullanilmadigi icin bunu
void f()
diye cevirmis ve "this" hic bir zaman defere edilmedigi icin kodumuz patlamamis.
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]