New/Delete überschreiben



  • Moin

    ich hab mir vorhin einen kleinen Speichermanager geschrieben. Dafür habe ich dann eigene Funktionen fürs allozieren und freigeben von speicher. aber ich will jetzt nicht immer meine eigene Funktion schreiben.

    das ist die definition der allozier funktion (fürs freigebne sieht die ähnlich aus, hat bloß nur den char)

    void* MemAlloc(size_t, char*);
    

    so, wie krieg ich das jetzt hin, das wenn ich folgendes aufrufe:

    int* p;
    p = new int;
    

    folgender code ausgeführt wird:

    int* p;
    p = MemAlloc(int, "p");
    

    Kann mir jemand da helfen?

    MfG
    Eldarion



  • du kannst schonmal "int" nicht an size_t übergeben... vielleicht eher sowas wie sizeof(int i). Und dann schau dich mal im Netz nach dem Thema "Operator new überladen" um, gibt bestimmt ne Menge infos zu dem Thema. Meyers' effective C++ ist da auch zum empfehlen.

    PS: wenn du operator new überschreibst, denk dran, auch operator delete entsprechend zu überschreiben. Du musst den Speicher schließlich auch so freigeben, wie du ihn dir besorgt hast 😉



  • ok, schonmal danke für den tipp. ich werde mich dann mal umschauen und bei fragen noch mal melden.

    das mit delete war mir klar. 🙂



  • ich hab mal gegooglte und dann gesehen das man new für jeden typ überladen muss. kann man das nicht irgendwie anders machen? weil es wäre sehr viel arbeit für jeden typ den ich verwende den new operator zu überschreiben.



  • Klar kannst du operator new auch als globale Funktion überladen, wenn du lustig bist - aber das bitte auf eigenes Risiko (so ein globaler operator new krallt sich wirklich jeden new-Aufruf in deinem System).



  • das ganze ist auch gewünscht das er sich jeden aufruf holt 🙂

    dann mal danke. ich hab jetzt auch hier im forum noch ienen artikel zum thema gefunden.



  • Wenn ich sage "jeden", dann meine ich wirklich jeden - das betrifft auch new-Aufrufe, die nur indirekt etwas mit deinem Programm zu tun haben (und wenn MemAlloc() selbst wieder auf new zurückgreift, hast du eine wunderbare Endlos-Rekursion). Und deshalb sollte man besser die Finger von den globalen Speicher-Operatoren lassen (wenn du sie doch überschreiben mußt, dann aber auf eigene Gefahr).

    PS: Wenn du festlegen willst, welche new-Aufrufe du über deine Funktion laufen sollen, empfiehlt sich ein Placement new.


Anmelden zum Antworten