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.


Log in to reply