Frage

Ich mache einen wenig Speicherleck Finder in meinem Programm, aber Weg von Überlastung neue und löschen (und auch neue [] und delete []) scheint nicht, etwas zu tun.

void* operator new (unsigned int size, const char* filename, int line)
{
    void* ptr = new void[size];
    memleakfinder.AddTrack(ptr,size,filename,line);
    return ptr;
}

So wie ich new überlastet ist im Code-Schnipsel oben gezeigt. Ich denke, es ist etwas, mit dem Operator void * Rückkehr, aber ich weiß nicht, was zu tun ist.

War es hilfreich?

Lösung

void* ptr = new void[size];

Kann das nicht tun. Fix it.

Sie niemals versuchen, neue zu überlasten / löschen global. Entweder haben sie in einer Basisklasse und leiten alle Objekte dieser Klasse oder verwenden Sie einen Namespace oder eine Vorlage allocator Parameter. Warum, könnten Sie fragen. Denn wenn Ihr Programm ist mehr als eine einzige Datei und unter Verwendung von STL oder anderen Bibliotheken Sie gehen vermasseln.

Hier ist eine destillierte Version von new Betreiber von VS2005 new.cpp:

void * operator new(size_t size) _THROW1(_STD bad_alloc)
{       // try to allocate size bytes
   void *p;
   while ((p = malloc(size)) == 0)
    if (_callnewh(size) == 0)
     {       // report no memory
        static const std::bad_alloc nomem;
        _RAISE(nomem);
     }

     return (p);
}

Andere Tipps

RE:

  

Sie niemals versuchen, neue zu überlasten / löschen global

Warum ist es, wenn jemand versuchen, ein weniger gemeinsames Merkmal von C ++ zu verwenden, jemand wirkt, wie es nie getan werden sollte?

Es ist die ganze Zeit getan, ist es durchaus üblich, und ich habe nicht für Unternehmen gearbeitet, die dies nicht taten.

global überlastet neu und löschen Sie sind äußerst hilfreich bei der Verfolgung Speicher, Speicher Fehler, Pufferüberläufe, etc.

Niemand bei klarem Verstand wird mit mehreren Millionen Zeilen Code durch ein Programm gehen, und ein neuen hinzuzufügen und löschen Mitglied zu jeder Klasse. Das ist einfach nur dumm.

Vielleicht können Sie tun, was Sie mit ein wenig Magie Präprozessor wollen:

#include <iostream>

using namespace std;

void* operator new (size_t size, const char* filename, int line) {
    void* ptr = new char[size];
    cout << "size = " << size << " filename = " << filename << " line = " << line << endl;
    return ptr;
}

#define new new(__FILE__, __LINE__)

int main() {
    int* x = new int;
}

Ich denke, das Problem hier ist, dass Ihr neues Parameterprofil entspricht nicht die die Standard-Bedien neu, so dass man nicht versteckt zu werden (und damit immer noch verwendet wird).

Ihre Parameterprofile für neue und löschen müssen wie folgt aussehen:

void* operator new(size_t);
void operator delete(void*, size_t);

Sind Sie der überladenen Operator richtig aufrufen, das heißt, es die folgenden zusätzlichen Parameter übergeben?

Das Problem setzt mit den beiden Argumenten, die Sie überlasteten neuen Betreiber hinzugefügt haben. Versuchen Sie Dateinamen machen und Line global in irgendeiner Weise (oder Membervariablen, wenn Sie neu zu überlasten und löschen für eine einzelne Klasse). Das sollte besser funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top