Objekt lebt out-of-scope weiter



  • In folgendem Programm wird ein Objekt nicht richtig deallokiert:

    struct Foo
    {
    	int n;
    
    	Foo() :
    		n(42)
    	{
    	}
    
    	~Foo()
    	{
    		std::cout << "~Foo()" << std::endl;
    	}
    
    	void print()
    	{
    		std::cout << n << std::endl;
    	}
    };
    
    int main()
    {
    	Foo *p;
    
    	{
    		Foo s;
    		p = &s;
    	}
    
    	p->print();
    	return 0;
    }
    

    ~Foo() wird zwar aufgerufen, n hat aber immer noch den ursprünglichen Wert.

    Und wenn ich das Objekt auf dem Heap erstelle:

    {
    	Foo *s = new Foo();
    	p = s;
    	delete s;
    }
    

    dann läufts auch wie erwartet (bei mir n = 0xFEEEFEEE).


  • Mod

    Undefiniertes Verhalten ist undefiniert.

    Aber hier noch eine Erklärung, warum du dieses Verhalten beobachtest: Stackspeicher wird normalerweise nicht mit Debugwerten überschrieben, wenn er nicht mehr benötigt wird. Höchstens vielleicht als ganzes bei Rückkehr aus einer Funktion, aber nicht innerhalb einer Funktion.



  • Danke für die Erklärung!



  • Bzw. wenn du sehen willst dass "s" nimmer lebt, probier mal das:

    int main() 
    { 
         Foo *p; 
    
         { 
             Foo s; 
             p = &s; 
         } 
    
         { 
             std::string x = "x";
         }
    
         p->print(); 
         return 0; 
    }
    

    Im Debug-Mode.
    Wobei ich natürlich nicht *garantieren* kann dass dann ein anderer Wert ausgegeben wird. (Weil halt eben, wie SeppJ ja schon geschrieben hat, undefiniertes Verhalten eben undefiniert ist.) Sollte aber normalerweise so sein.


Anmelden zum Antworten