Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: MRKMNT 01. 05. 2014, 19:44:09

Název: C++ a stack
Přispěvatel: MRKMNT 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?
Název: Re:C++ a stack
Přispěvatel: anon 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>

Název: Re:C++ a stack
Přispěvatel: anon 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++ ...
Název: Re:C++ a stack
Přispěvatel: kaiten 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.


Název: Re:C++ a stack
Přispěvatel: MRKMNT 01. 05. 2014, 20:30:06
Aha chápem...

ďakujem za vysvetlenie.
Název: Re:C++ a stack
Přispěvatel: Ondřej Novák 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