C++ a stack

MRKMNT

C++ a stack
« kdy: 01. 05. 2014, 19:44:09 »
Caute, kedy sa konci zivotny cyklus premenenej na zasobniku?

Kód: [Vybrat]
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?


anon

Re:C++ a stack
« Odpověď #1 kdy: 01. 05. 2014, 19:55:30 »
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>


anon

Re:C++ a stack
« Odpověď #2 kdy: 01. 05. 2014, 20:12:55 »
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++ ...

kaiten

Re:C++ a stack
« Odpověď #3 kdy: 01. 05. 2014, 20:13:47 »
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.



MRKMNT

Re:C++ a stack
« Odpověď #4 kdy: 01. 05. 2014, 20:30:06 »
Aha chápem...

ďakujem za vysvetlenie.


Re:C++ a stack
« Odpověď #5 kdy: 02. 05. 2014, 09:47:17 »
Premyslim, co je cilem tohodle prispevku. To jsou vsichni zhuleny, nebo jde o nejaky programatorsky chytak?

&Object() to je dobra prasarna