Vor delete pointer auf NULL prüfen?



  • Nexus schrieb:

    template <typename T>
    DeleteAndNull(T* Pointer)
    {
        delete Pointer;
        Pointer = 0;
    }
    
    template <typename T>
    DeleteAndNull(T*& Pointer)
    {
        delete Pointer;
        Pointer = 0;
    }
    


  • Argh, danke. 🙄
    (Kommt davon, wenn man das nie braucht...)

    Edit2: Dass ich so viele Flüchtigkeitsfehler mache, hätte ich jetzt auch nicht gedacht... Vielleicht nächstes Mal Post noch einmal genau anschauen. 😉



  • audacia schrieb:

    template <typename T>
    DeleteAndNull(T*& Pointer)
    {
        delete Pointer;
        Pointer = 0;
    }
    
    template <typename T>
    void DeleteAndNull(T*& Pointer)
    {
        delete Pointer;
        Pointer = 0;
    }
    


  • danke Jungs,

    so ein ähnliches macro wie

    #define myDELETE(PTR) \
        delete PTR; PTR = NULL;
    

    hatte ich vorher schon, jedoch mit der Überprüfung auf NULL. Das macht aber Probleme mit dem statischen Codeanalyzer (cppcheck), den ich gerade evaluiere. Daraufhin kam die frage auf, ob die Überprüfung überhaupt sein muss. Ein extra template halte ich jetzt für ein wenig übertrieben.

    schönes Wochenende



  • volkard schrieb:

    template <typename T>
    void DeleteAndNull(T*& Pointer)
    {
        delete Pointer;
        Pointer = 0;
    }
    

    Uah. 🤡



  • wurfholz schrieb:

    danke Jungs,

    so ein ähnliches macro wie

    #define myDELETE(PTR) \
        delete PTR; PTR = NULL;
    

    hatte ich vorher schon, jedoch mit der Überprüfung auf NULL. Das macht aber Probleme mit dem statischen Codeanalyzer (cppcheck), den ich gerade evaluiere. Daraufhin kam die frage auf, ob die Überprüfung überhaupt sein muss. Ein extra template halte ich jetzt für ein wenig übertrieben.

    Lieber das (typsichere) Template als ein Makro. Effektiv wirds keinen großen Unterschied machen, da das Template vermutlich eh geinlined wird. Aber die bekannten Anfälligkeiten von Makros fallen weg.



  • wenn wir schon beim unfug sind, warum nicht ein wenig gas geben?

    struct SafeDeleter
    {
      template <typename T>
      void operator,(T*& Pointer)
      {
        delete Pointer;
        Pointer = 0;
      }
    };
    #define delete SafeDeleter(),
    

    endlich weiß ich, wozu es gut istm den kommaoperator zu überladen. 👍



  • LOL, nicht übel! 🤡



  • Wirklich nett, volkard... 🙂

    Aber was machst du bei delete[] ? :p



  • pumuckl schrieb:

    wurfholz schrieb:

    danke Jungs,

    so ein ähnliches macro wie

    #define myDELETE(PTR) \
        delete PTR; PTR = NULL;
    

    hatte ich vorher schon, jedoch mit der Überprüfung auf NULL. Das macht aber Probleme mit dem statischen Codeanalyzer (cppcheck), den ich gerade evaluiere. Daraufhin kam die frage auf, ob die Überprüfung überhaupt sein muss. Ein extra template halte ich jetzt für ein wenig übertrieben.

    Lieber das (typsichere) Template als ein Makro. Effektiv wirds keinen großen Unterschied machen, da das Template vermutlich eh geinlined wird. Aber die bekannten Anfälligkeiten von Makros fallen weg.

    Bei

    if (condition)
      myDELETE(p);
    

    macht das einen gewaltigen Unterschied, ob es ein Makro oder ein Template ist.



  • tntnet schrieb:

    macht das einen gewaltigen Unterschied, ob es ein Makro oder ein Template ist.

    leider ja, wenn man seine nase zu tief in die gewohneheiten mancher c-programmierer gesteckt hat.

    while(p!=fh9)
      myDELETE(*++p);
    

Anmelden zum Antworten