new und delete überladen



  • Hi,

    zwecks Finden von Memory Leaks habe ich vor, new und delete zu überladen. new soll (erstmal) so überladen sein, dass es die Größe des zu reservierenden speichern cout-et. Mein Code dazu sieht so aus:

    void* operator new(size_t nSize)
    {
        cout << nSize << endl;
        char* pMem = ::new char[nSize];
        return pMem;
    }
    
    void* operator new[](size_t nSize)
    {
        cout << nSize << endl;
        char* pMem = ::new char[nSize];
        return pMem;
    }
    

    Allerdings stürzt dabei das Programm schon ab, bevor die erste Programmzeile ausgeführt wird. Was ist falsch? Ich verwende den VC++ Compiler, da das Projekt aber plattformunabhängig sein soll, sollte es auch mit dem GCC etc. kompilierbar sein.

    Vielen Dank für alle Antworten und so 🙂



  • probiers mal mit malloc.
    so wirds in C++ ENT-Packt gemacht.



  • Soviel ich weiß, ruft malloc nicht die Konstruktoren eventuell erstellter Objekte auf dem Heap auf. Da ich mit new allerdings auch Objekte erstelle, wäre das hier etwas unpraktisch. Oder liege ich da falsch?



  • die Funktion operator new() ruft ebenfalls keine Konstruktoren auf. Das tut der new-Operator (schön verwirrend oder ;))

    Hast du's mal mit nem Debugger versucht?



  • die Funktion operator new() ruft ebenfalls keine Konstruktoren auf. Das tut der new-Operator (schön verwirrend oder ).

    Das verstehe ich nun nicht so ganz. Worin leigt der Unterschied zwischen operator new() und new-Operator? Übrignes: Mit malloc funktioniert es auch nicht.



  • Der new-Operator hat 2 Aufgaben:

    1. Speicher besorgen
    2. Konstruktor aufrufen

    wobei er für 1) die Funktion operator new aufruft.



  • Original erstellt von Phobos:
    **Hi,

    zwecks Finden von Memory Leaks habe ich vor, new und delete zu überladen. new soll (erstmal) so überladen sein, dass es die Größe des zu reservierenden speichern cout-et. Mein Code dazu sieht so aus:

    void* operator new(size_t nSize)
    {
        cout << nSize << endl;
        char* pMem = ::new char[nSize];
        return pMem;
    }
    
    void* operator new[](size_t nSize)
    {
        cout << nSize << endl;
        char* pMem = ::new char[nSize];
        return pMem;
    }
    

    Allerdings stürzt dabei das Programm schon ab, bevor die erste Programmzeile ausgeführt wird. Was ist falsch? Ich verwende den VC++ Compiler, da das Projekt aber plattformunabhängig sein soll, sollte es auch mit dem GCC etc. kompilierbar sein.

    Vielen Dank für alle Antworten und so :)**

    nett. eine rekursive Funktion ohne Abbruchbedingung



  • Also wenn ich statt new malloc und statt cout printf nehme geht es, solange ich in operator new() keinen neuen Speicher per new reserviere. Genau das habe ich aber vor (In der Debug-Version des Programms will ich mir merken, wo genau Speicher reserviert ist). Bei jedem Aufruf des operator new() wird also ein Memory-Objekt in eine Liste getan (welches natürlich mit new erstellt wird). Beim Erstellen dieses Memory-Objektes soll natürlich _kein_ neues Memory Objekt erstellt werden, da es sonst zu einer Endlosrekursion kommt.

    Mein Ansatz dazu war Folgender: Ich habe eine globale Variable vom Typ l_debug namens debug:

    void* __cdecl operator new(size_t nSize)
    {
        return debug.allocate_memory(nSize);
    }
    
    void* __cdecl operator new[](size_t nSize)
    {
        return debug.allocate_memory(nSize);
    }
    

    l_debug::allocate_memory() sieht so aus:

    void* l_debug::allocate_memory(int iLen)
    {
        l_memory* pMem = new l_memory(iLen, 1);
        m_lMemory.push_front(pMem);
    //  printf("%d\n",iLen);
        return malloc(iLen);
    }
    

    Damit es keine Endlosrekursion bei der Sache gibt, überlädt die l_debug-Klasse ebenfalls den new-Operator:

    void* l_debug::operator new(size_t nSize) { return(malloc(nSize) ); }
    void* l_debug::operator new[](size_t nSize) { return(malloc(nSize) ); }
    

    Allerdings funktioniert das so nicht, da beim Erstellen des Memory-Objektes nicht der Klasseninterne operator new() sondern der globale operator new() aufgerufen wird. Kann man da etwas dagegen unternehmen?


Anmelden zum Antworten