Debug Assertion Failed???



  • Ich habe in einem Programm einen merkwürdigen Fehler erhalten:
    Der Compiler hat keinen Fehler gefunden, aber vor Ende des Programms kam ein Fehlerfenster:

    Debug Assertion Failed

    Prtogramm: ...
    File: dbgheap.c
    Line: 1011

    Expression: _crtIsValidHeapPoimnter(pUserData)

    ich nehme mal an, dass das irgendiwe mit meiner Smartptr Klasse zu tun hat, hier der Code:

    template <class T> class DLL SmartDecoState 
    	{
    	protected:
    		T* ptr;
    	public:
    		inline SmartDecoState(){try{ptr = new T;}catch(...){ptr=0;}}
    		explicit inline SmartDecoState(T* nptr){ptr=nptr;}
    		inline SmartDecoState(const SmartDecoState<T>& param);
    		virtual ~SmartDecoState(){delete ptr;}
    		inline void newUnit(T* nptr);
    
    		SmartDecoState<T>& operator=(const SmartDecoState<T>& param);
    
    		T* operator->() const;
    		T& operator *() const;
    	};
    

    Ich denke mal das solle reichen, aber woher kommt der Fehler und wie kann ich ihn beheben?

    thx
    Glamdring



  • Ich hab die Lösung gefunden: Etwas sollte mit delete gelöscht werden, dass nicht mit new erzeugt wurde 🤡 🤡

    mfg
    Glamdring



  • Sehe ich das richtig, dass dein Objekt gelöscht wird, selbst wenn es von anderen Pointern noch referenziert wird?



  • Nene, eher so:

    void dosomethind(Unit* ptr)
    {
        //...
        delete ptr;
    }
    
    Unit Franz;
    dosomething(&Franz);
    

    mfg
    Glamdring



  • Ich meinte so:

    SmartDecoState<int> a;
    
    {
        SmartDecoState<int> b;
        b = a;
    }
    
    // b wurde hier zerstört, der Destruktor löscht das int, auf das a und b zeigen.
    int x = *a;  // aua
    

    Oder kopierst du das Objekt im operator=? Das wäre aber nicht etwas, was ich bei einem Pointer erwarten würde.


Anmelden zum Antworten