[c++] [static] [inline] czemu ten kod działa?

0

Witam

Oto co znalazlem dzisiaj w kodzie:

class klasa
{
     static CString s_zmienna;
     virtual void jakas_funkcja_wirtualna();
public:
     CString zwroc_zmienna() {::OutputDebugString("kukuruku"); return s_zmienna};
}
CString klasa::s_zmienna= "jakis tekst";

main()
{
     klasa* pklasa = NULL;
     CString str = pklasa->zwroc_zmienna() ; 
}
 

mamy utworzony wskaznik i podstawiona wartosc NULL pod niego.
dalej mamy wywolanie metody zwracajacej wartosc statycznego pola i wypisujacej jakis tekst
To dziala choc wg. mnie nie ma prawa. czy ktos moze mi wytlumaczyc jak to mozliwe? czy moze
byc to zwiazane z tym, ze zwracana jt wartosc statyczna?
To ze funkcja jt inline nie ma znaczenia, sprawdzilem.
Uzywam VS2003 i win XP

0

A jaki dokładnie błąd Ci wyskakuje bo w sumie powinno działać, postaw średnik na końcu deklaracji klasy jeszcze

0

Tak, to dlatego, że zwracana wartość jest 'static' - jest ona wspólna dla wszystkich obiektów danej klasy. Wskaźnik może pokazywać na jakikolwiek adres.

0

na gcc - bodajże 3.4.5 (z CodeBlock 8.02) działa to równiez...

0

zastanow sie, skad bierze sie crash typu 'nullpointer'..
musi byc jakas wartosc rowna zeru, cos potem musi ja potraktowac jako wskaznik i sprobowac odczytac/zapisac cos do pamieci pod ten adres.
calkiem mozliwe jest, ze:

{int* blah = 0;*blah;}

nie wywali wyjatku/bledu. *blah nie wykonuje nic, kompilator moze je "wy-optymalizowac" i nic z tego nie zostanie, program poleci dalej jak gdyby nigdy nic tam nie bylo napisane. zgadza sie?

to teraz spojrz na te swoje metody:

metody istnieja zawsze i ich kod jest znany podczas dzialania programu.
kod metody "klasa::zwroc_zmienna" jest osiagalny zawsze [dobra, pomijam dll'ki] i skadkolwiek.
to znaczy, ze teoretycznie 'skoczyc' do tej metody mozesz zawsze, skadkolwiek, najwyzej cos sie wywali -- np. poniewaz ta metoda spodziewa sie ze bedzie wywolana w jakis okreslony sposob, ze parametry beda takie a siakie, etc

jesli napiszesz metode, ktora NIE KORZYSTA ze wskaznika this, np. int x(){return 5;} - czemu ona mialaby sie wywalic jesli this == 0x00000000 ? program skoczyl do metody, napotkal natychmiast return 5; i koniec. podobnie u Ciebie - zaden element metody nie uzywa this, tzn. nie probuje wykonac (*this) ktore to NIE zostaloby "wy-optymalizowane", wiec nie ma nikogo kto by zauwazyl ze this jest nullptr'em. nic wiecej, zero magii.

gorzej, jesli ta metoda bylaby wirtualna jak jej poprzedniczna :) wtedy do jej odpalenia potrzebny jest this!=0, poniewaz runtime musi znalezc vtable..

edit: "wy-optymalizowane" - tzn. zauwazone jako niepotrzebne i nic niewnoszace, i przez to calkowicie usuniete z wyniku kompilacji

0

Zgadzam sie, brak uzycia this w metodzie w pewnym sensie usprawiedliwia fakt, ze wskaznik nie musi wskazywac na cos sensownego.

BTW: Zrobilem kolejna probe przy wylaczonej optymalizacji w 'propertisach'. W dalszym ciagu program wykonuje sie poprawnie.

Pozdrawiam

0

tak, bo w Twoim przypadku to nie jest sprawa optymalizacji. tam po prostu this nie jest uzywany i nie ma co sie wywalic na jego nieprawidlowej wartosci

1 użytkowników online, w tym zalogowanych: 0, gości: 1