Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: MRKMNT 01. 05. 2014, 19:44:09
-
Caute, kedy sa konci zivotny cyklus premenenej na zasobniku?
class Object
{
public:
void test() { cout << "Test" << endl; }
};
Object* foo() { return &Object(); }
void main()
{
auto bar = foo();
bar->test();
system("pause");
}
Tuna som cakal, ze sa objekt na stacku uvolni po ukonceni funkcie foo() a funkcia mi vrati ukazovatel na neexistujuci objekt. Po zavolani metody test som cakal chybu, ale ta metoda sa normalne zavola ako keby sa nechumelilo WTF?
-
system("pause") jo? :o
Ale az na ten windows-only pristup ... dobra otazka! Samozrejme mas pravdu!
A cim to jako kompilujes? gcc ti tohle imho ani nedovoli zkompilovat protoze "taking address of temporary"
A taky tam prijde "using namespace std" a "import <iostream>
-
Aha, zajimave ze tenhle kod zrovna bude fungovat, protoze bar->test() jen zavola funkci (ktera neni virtual!) a neodkazuje se na this (jednodusse receno), takze i kdyz ten objekt uz umrel, tak on se vubec nepouziva :-)
Musim se priznat, ze jsem musel podivat na ten assembler co g++ vygenerovalo (g++ -S --std=c+1 x.cpp), aby me docvaklo co se tam vlastne deje :-)
Udelej tu metodu "virtual" a zavolej jeste nejakou funkci mezi tim "auto bar = foo();" a "bar->test();" a uz to bude failovat jak by si ocekaval.
Podivej se jak zapnout vsechny warning flagy svemu compileru a snad by te na to taky upozorni jak g++ ...
-
Objekt na stacku furt je a bude tam dokud nebude přepsán. Jeho datová část je navíc nepotřebná pro volání tvé funkce, takže i když bude objekt přepsán, vše poběží dál.
-
Aha chápem...
ďakujem za vysvetlenie.
-
Premyslim, co je cilem tohodle prispevku. To jsou vsichni zhuleny, nebo jde o nejaky programatorsky chytak?
&Object() to je dobra prasarna