Problem beim Löschen eines Objekts



  • Hi,
    Ich habe mir eine Liste geschrieben. CKnot ist die Klasse für einen Knoten in der Liste:

    class CKnot;
    typedef CKnot *PKnot;
    
    class CKnot
    {
    public:
    	void*	Value;
    	PKnot	Next;
    	PKnot	Prior;
    
    	inline CKnot(void* pValue)	{ Value = pValue; Next = Prior = NULL; }
    };
    

    Value soll man alle möglichen Klassen zuordnen können. Ich glaube eher nicht, dass das mit void* funktioniert.

    Wenn ich jetzt

    delete Value
    

    versuche, dann bricht das programm immer ab.

    Wie kann ich dem Compiler klar machen, dass es sich bei Value um eine Klasse handelt?

    Danke im Voraus



  • Nur mit Templates. Da ein void-Zeiger weder polymorph ist noch irgendwas über den Typ des Zeigers weiss, geht der Destruktoraufruf immer ins Leere.



  • Danke für deine Antwort, ich werd mich mal darüber informieren.



  • So etwas nennt man "undefiniertes Verhalten" 😉



  • also muss ich -wenn ich mich mal einmsichen darf-^^ den zeiger vorher casten bspw so:

    delete (PIRGENDWAS)Value;

    oder wie ... ? 😕



  • Ja, das geht aber nur wenn Du 100%ig weisst, dass hinter dem void-Zeiger auch wirklich so ein PIRGENDWAS steht. Ein falscher Cast läuft nicht ins leere, er würde das Objekt einfach falsch interpretieren und dann natürlich auch falsch löschen. Vollständig typenlose Container wie in .NET a la

    void* zeiger = vec[0];
    if (typeof(zeiger) is MyClass)
      delete (MyClass*) zeiger;
    

    gibt es nicht. Deshalb löst man das eher mit Templates.


Anmelden zum Antworten