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