Delete Operator für MyPtr Klasse?



  • Hi, ist es möglich für z.B. eine eigene Pointer Klasse den delete Operator derart zu überschreiben, dass er das interne Objekt auf dem Heap deleted anstatt des MyPtr Objektes, welches ja auf dem Stack liegt?
    Ich hätte mir das wie folgt "Pseudocode" vorgestellt:

    template <class T>
    class MyPtr
    {
    public:
    	MyPtr<T>(int* ptr) : _ptr(ptr)
    	{
    	}
    
    	static void operator delete(void* ptr)
    	{
    		MyPtr<T>* pMyPtr = reinterpret_cast<MyPtr<T>*>(ptr);
    		delete pMyPtr._ptr;
    	}
    
    	int* _ptr;
    };
    
    MyPtr<int> pValue= new int(42);
    	delete pValue;
    


  • Warum willst du das auf diese Weise tun ja weißt du denn nicht was ein Destruktor ist.



  • Du kannst nicht einfach Schlüsselworte für deine eigenen Zwecke missbrauchen.
    Du kannst aber natürlich einen Memberfunktion erstellen, die den Zeiger deleted und zurücksetzt. Diese Funktion nennst du reset(), analog zu std::unique_ptr.



  • DeleteOp schrieb:

    MyPtr<int> pValue= new int(42);
    	delete pValue;
    

    Warum willst du was deleten, was du nicht genewt hast? Das ist sehr unschön.

    Was ist überhaupt der Sinn von MyPtr? Wenn du am Scope-Ende delete aufrufen willst, kannst du das auch direkt auf einem int* machen.


  • Mod

    DeleteOp schrieb:

    Hi, ist es möglich

    In C++ ist vieles möglich, wenn man gewillt ist, den Rest der Zeit im Rollstuhl zu verbringen, weil man sich beide Beine weggeschossen hat.

    #include <new>
    
    template <class T>
    class MyPtr
    {
    public:
        MyPtr<T>(int* ptr) : ptr(ptr) {};
    
        operator int*() {
            return ptr;
        }
        T* ptr;
    };
    
    int main()
    {
        MyPtr<int> p(new int(42));
        delete p;
    }
    


  • Das ist natürlich nur ein Minimalbeispiel gewesen. Ich habe einen GarbageCollector geschrieben, da z.B. shared_ptr und co. meiner Meinung nach Krücken sind (zirkulare Abhängigkeiten, usw.). Um noch ein wenig mehr Performance rausholen zu können wollte ich jetzt trotzdem die Möglichkeit haben in gewissen Fällen, wo der Besitz des Objektes klar ist, diese auch sofort als Garbage markieren zu können. Am besten einfach durch Aufruf von delete, genau wie bei einem "rohen" Zeiger. Natürlich sollte man dann wissen wann man delete Aufruft oder besser nicht. Aber das ist bei "rohen" Zeigern ja nicht anders.
    Und unschöne Hacks wie eine Delete Funktion machen zu müssen hätte ich gerne lieber vermieden. Solche hässlichen Konstrukte überlasse ich den Fricklern der Std...

    @camper
    Danke für den konstruktiven Beitrag. Werde das mal mit dem Konvertierungsoperator versuchen.


Log in to reply