January 21, 2019

Merhabalar, öncelikle başlık konu ile alakasız olmuş olabilir. Kusura bakmayın. :) İnternette dolaşırken aşağıdaki kodu gördüm ve şaşırdım. "p" nullpointer olmasına rağmen "f" fonksiyonunu çağırabiliyor. Bunun nedeni nedir ? Fonksiyonlarda aslında değişkenler gibi "new" ile örneklediğimiz zaman bellekte yer edinmiyorlar mı ? Aynı kodu java ile denemedim ve "NullPointerException" hatası aldım.

#include <iostream>

class Foo{
public:
 Foo(int i=0){ _i=i;}
 void f(){
   std::cout<<"Foo::f()"<<std::endl;
 }
private:
 int _i;
};

int main(){
 Foo* p = 0;
 p->f();
}

Output:
Foo::f()

Şimdiden Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 21, 2019

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. ]