2 Stimmen

Die Zeilennummer der aufgerufenen Funktion erhalten

Bitte lass es mich wissen, ob ich es machen kann oder nicht?

Ich schreibe eine Bibliothek, die dazu dienen könnte, Speicherzuweisung und -freigabe in C++ zu verfolgen. Kurz gesagt, ich versuche zu sehen, ob meine Anwendung keine Speicherlecks hat. Das ist bisher das, was ich gemacht habe.

Ich habe den new- und den delete-Operator überschrieben und jetzt. Immer wenn die Anwendung new verwendet, plane ich, die Adresse und die Anzahl der Bytes zu speichern, die in diesem Aufruf zugewiesen wurden. Ebenso, wenn das delete auf dieser Adresse aufgerufen wird, werde ich das aus der gespeicherten Liste entfernen. Bis jetzt ist das in Ordnung. Aber ich möchte den Dateinamen und die Zeilennummer speichern, von der aus "new" aufgerufen wird. Das kann ich nur im überschriebenen new tun. Gibt es eine Möglichkeit, die Zeilennummer in der überschriebenen Funktion zu bekommen?


1    int main()
2    {
3       // Nehmen wir an, A ist eine Struktur
4        A *a = new A();
5        return 0;
6     }
7    void* operator new( Größe )
8    {
9        //
10       // speichere die Zeilennummer und den Dateinamen in Zeile 4 ??? Kann ich das tun?
11       return (malloc(Größe));
12   }
------------------------

4voto

Stephane Rolland Punkte 36818

Seit C++20 können Sie std::source_location verwenden, das bietet:

  • Zeile
  • Spalte
  • Dateiname
  • Funktionsname

Für frühere Versionen von C++ geben traditionell die Makros __LINE__ die Zeilennummer an, aber auch __FUNCTION__ und __FILE__ sind wirklich hilfreich, da sie den const char* der umschließenden Funktion und den Dateinamen liefern.

Tatsächlich ist __FUNCTION__ nicht standardmäßig, wird jedoch von mehreren Compilern unterstützt.

Leider erhalten diese Makros nur ihren Wert an ihrer Stelle. Daher ist es nicht möglich, nach dem Aufrufer zu fragen.

Sie sollten die Makros __LINE__ und __FILE__ überall dort schreiben, wo Sie new verwenden. :(.

3voto

user543630 Punkte 51

Endlich habe ich eine Antwort von einem ähnlichen Thread in diesem Forum erhalten... Der folgende Code hat funktioniert... Nehmen wir an,

class A
{
    public:
    char str[1000];
    A()
    {
        strcpy(str,"Standard-String");
    }
    A(const char* s)
    {
        strcpy(str,s);
    }
};

void * operator new (unsigned size, char const * file, int line)
{
    cout << "Datei = " << file << endl;
    cout << "Zeile = " << line << endl;
    return( malloc(size));
}
#define new new(__FILE__, __LINE__)
int main()
{
    A *a = new A("Leckage");
    printf("%s",a->str);
    delete a;
    return 0;
}

Verwandter Beitrag, wo ich die Antwort gefunden habe... Überladen von new und delete in c++

1voto

jlliagre Punkte 28212

Sie können die Studio dbx-Laufzeitüberprüfungsfunktion verwenden, um Speicherlecks unter Solaris zu identifizieren (http://blogs.oracle.com/janitor/entry/runtime_memory_checking .) libumem kann auch sehr hilfreich sein (http://blogs.oracle.com/pnayak/entry/finding_memory_leaks_within_solaris .)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X