delete[] Implementation



  • Hi!

    Kann ich soetwas machen, vorrausgesetzt das Array besteht prinzipiell NUR aus Integertypen, also es gibt absolut keine Probleme bezüglich des Destruktors etc:

    void free(uintptr_t address)
    {
    delete[] reinterpret_cast<void*>(address);
    }

    GCC beschwert sich nämlich dass

    warning: deleting ‘void*’ is undefined

    Ansonsten müsste ich eben auf malloc ausweichen ...

    Mfg,
    Heinz.



  • Kannst du vielleicht sagen, was du vor hast? Wozu soll das gut sein? Und wofür soll der Cast nach void * gut sein?


  • Administrator

    delete[] auf ein Array, dessen statischer Typ anders ist, als jener bei der Erstellung, ist undefiniert. Daher ist delete[] auf void* immer undefiniert, da es keinen void -Typ gibt.

    Was hast du denn grundsätzlich vor? Wie kommt es überhaupt so weit?

    Grüssli



  • Ich muss gerade einen kleinen Hack für eine Scripting-Sprache ohne Möglichkeit zur manuellen Speicherverwaltung schreiben.

    Dabei exportiere ich diese Funktion spezialisiert für Integertypen(unsigned, signed, 8-64 bits):

    template<typename Data>
          uintptr_t allocate(size_t amount) const
          {
             try
             {
                Data* temp = new Data[amount];
                return reinterpret_cast<uintptr_t>(temp);
             }
             catch(...)
             {
                throw MemoryAllocationException(
                                           "Can't allocate that much memory");
             }
          }
    

    Ich möchte ungern zu jeder allocate<X> Funktion eine free<X> Funktion exportieren.

    Mfg



  • allocate() ist ein schlechter Name für eine Funktion, die auch Objekte konstruiert. Sie sollte nur Speicher bereitstellen, ebenso wie free() diesen nur freigeben sollte, ohne Objekte zu zerstören.

    Falls du automatisch ein Array konstruieren willst, musst du die Elemente auch irgendwann zerstören. Dazu darfst du kein void* verwenden.


Anmelden zum Antworten