problem mit std::stack



  • Hier ist mein Code:

    class Memorymanager
    {
    protected:
    	stack<void*> Memory;
    public:
    	Memorymanager(){}
    	void push(void* mem){Memory.push(mem);}
    	void pop(){delete Memory.pop();}
    	~Memorymanager();
    };
    
    Memorymanager::~Memorymanager()
    {
    	while(!Memory.empty())
    	{
    		delete Memory.pop();
    	}
    }
    
    class Test
    {
    public:
    	Test(){cout << "new test" << endl;}
    	~Test(){cout << "delete test" << endl;}
    };
    
    int main()
    {
    	Memorymanager Hund;
    	Hund.push(__new<Test>());
    	return 0;
    }
    

    Ist docvh OK, es ist nicht der schönste Code ever, aber VC++ liefert mir 2 mal das hier:

    error C2541: delete : Objekte, die keine Zeiger sind, koennen nicht geloescht werden
    

    natürlich treten die Fehler bei pop undm destruktor auf, aber es müsste gehen.

    Wie mach ichs richtig?

    mfg



  • LOL?

    nimm das delete weg.



  • rofl
    Das ist das dümmste, was ich in meinem Leben gehört habe (falls es ernst gemeint war 😉 )



  • Hallo,
    da sind gleich zwei Probleme. Zum einen liefert pop nicht das gepoppte Element sondern nichts, du müsstest also delete memory.top(); memory.pop(); schreiben. Zum Anderen, und das ist wohl noch schlimmer, erzeugt dein Code undefiniertes Verhalten. Du darfst einen void-Pointer nicht mit delete löschen. Wenn es dir wirklich nur um die Freigabe von rohem Speicher geht, dann musst du die Funktion operator delete im Zusammenhang mit der Funktion operator new verwenden.

    Sowas:

    void* p = new Foo;
    delete p;
    

    ist aber verboten, sprich hat undefiniertes Verhalten.



  • Shit!, naja gut zu wissen.

    Also einen Stack für jeden Typ, oder ich leite alle Typen von nem anderem Typen ab (was besonders beieingebauten Typen garantiert funktionieren wird).

    thx



  • Hallo,
    also mir ist erstmal überhaupt nicht klar, was du eigentlich erreichen willst. Der Name deiner Klasse (Memorymanager) ist imo schon mal schlecht gewählt, da sie genaugenommen kein Memory managed. Vielmehr sorgt sie dafür, dass dynamisch allokierte Objekte automatisch freigegeben werden. Dafür gibt es aber eigentlich bessere Wege.
    Was spricht z.B. gegen einen SmartPtr?

    Ansonsten muss deine Klasse halt wirklich Memory managen. Sprich:
    Rohen Speicher anfordern und rohen Speicher freigeben. Nicht aber mit irgendwelchen Objekten rummachen.


Anmelden zum Antworten