check new + delete



  • Hallo und guten Tag

    Gibt es eine Möglichkeit zu prüfen, ob ein Object (Objectadresse) per New + Delete oder per "&" erstellt wurde. Würde mich einfach vollständigkeitshalber interessieren.

    Danke für die Antworten.

    Hier ein Beispiel

    #include "stdafx.h"
    #include <iostream>
    #include <list>
    
    class Obj{
    };
    
    class A{
    private:
    	std::list<Obj*> lstArray;
    	std::list<Obj*>::iterator iterator;
    
    public:
    	void setObj(Obj *o){
    		lstArray.push_back(o);
    	}
    	~A(){
    		for(iterator=lstArray.begin(); iterator!=lstArray.end(); ++iterator){
    			if((*iterator)){
    				//Hier wird natürlich ein Fehler produziert.
    				//Gibt es eine Möglichkeit dies zu prüfen.
    				delete (*iterator);
    			}			
    			(*iterator)=NULL;
    		}
    	}
    };
    
    class B:public A{};
    class C:public A{};
    class D:public A{};
    
    int _tmain(int argc, _TCHAR* argv[]){
    	B objB;
    	objB.setObj(&Obj());
    
    	C objC;
    	objC.setObj(new Obj());
    
    	D objD;
    	objD.setObj(&Obj());
    
    	return 0;
    }
    


  • Nein.
    Desweiteren erstellst du in Zeilen 35 und 41 ein Temporary und speicherst die Adresse darauf. Die Objekte werden aber beim nächsten Semikolon zerstört. Deswegen musst du alle Objekte via new erstellen und hast dann das Problem nicht.
    In diesem Fall ist es aber empfehlenswerter smart pointer zu verwenden, die kümmern sich automatisch um den Cleanup.
    Edit: In diesem speziellen Fall sind Pointer und new absolut überflüssig und du kannst die Objekte einfach so speichern.

    BTW:

    delete ptr;
    ptr=NULL;
    

    Ist sehr schlechter Stil - insbesondere im Destruktor, wo auch immer du das gelernt hast, ich würde die Quelle wechseln.



  • Die Frage kommt hier immer mal wieder alle paar Jahre auf.

    Auf puristischer Seite, wenn du die Erzeugen bzw. das Zerstören nicht einkapselst oder da die Kontrolle hast geht das nicht*. Wenn du da kapselst, kannst du dir ja ne Liste mitführen, die dir das nachhält.

    Andererseits sollte es den Programmierer nicht interessieren, wo die Daten liegen. Jedenfalls nicht die von Fremdcode. Klar, muss man gucken, wohin man seine Daten schaufelt, damits schön schnell ist und fehlerfrei etc.
    Sprich, was und vor allem warum willst du wissen wo die Objekte liegen?

    *: Es gibt so Tricks, dass man Adressenvergleiche macht. Das ging etwa so, dass man die Adresse eines Objekts mit einem Stackobjekt oder so vergleicht, und je nachdem ob die Adresse kleiner oder größer ist, liegt das Objekt auf dem Heap oder dem Stack. (Ich habs nicht mehr ganz im Kopf, deswegen bitte nicht köpfen). Aber das ist nicht plattformunabhängig und auch nirgends garantiert.



  • wachs schrieb:

    Gibt es eine Möglichkeit zu prüfen, ob ein Object (Objectadresse) per New + Delete oder per "&" erstellt wurde.

    Ja, das ist ganz einfach: mit & werden keine Objekte erstellt.



  • Du könntest den operator new überladen und dann eine Notiz im Objekt anlegen.



  • Danke euch für die Antwort.

    Interessante Möglichkeiten.

    smart pointer sind mir zwar ein Begriff. Hab sie aber noch nie genutzt. Werde schauen wie weit ich mit denen komme. Für dieses Beispiel reichen die bestimmt.

    Alle anderen werde ich mir auch anschauen.

    Nochmals Danke.

    wachs.


Anmelden zum Antworten