Ich habe beschlossen, die neuen, neuen [], ... Operatoren in meinen Klassen zu überladen, damit ich die Datei und die Zeile, an der sie aufgerufen wurden, protokollieren kann, um Speicherzuweisungen / -lecks leichter verfolgen zu können.
Jetzt sind die Probleme in meinen Stack- und Array-Klassen (und anderen Template-Container-Klassen, die Speicher zuweisen):
Wenn ich sie mit einer meiner Klassen benutze, die die neuen, neuen [], ... Operatoren überladen haben, funktioniert das gut.
Aber wenn ich es mit den Standard-C ++ - Datentypen (int, float, ...) verwende, kann ich sie nicht zuordnen, da kein überladener neuer Operator den Argumenten des neuen entspricht (__ LINE __, __ FILE __) Operator (oder andere wie Platzierung neu).
Beispiel für Stack-Code:
%Vor%Ich habe also keine guten Ideen, wie das funktioniert. Wenn ich neue (__ LINE __, __ FILE __) durch neue ersetze, verliere ich die Speicherprotokollierungsfähigkeit. Eine Lösung besteht darin, einen separaten Stapel für Standarddatentypen zu erstellen, in denen der Standardneue verwendet wird.
Gibt es eine Möglichkeit, zur Kompilierzeit festzustellen, ob ein Template-Parameter eine Struktur, eine Klasse oder ein eingebauter C ++ - Typ ist?
Wie gehst du mit solchen Sachen um? Was schlagen Sie vor? Irgendwelche Kommentare zu diesem Design (gut, schlecht) sind natürlich willkommen (nur nicht Sachen wie "erfinden Sie das Rad nicht mit Ihren eigenen Containern").
Beachten Sie, dass Ihre aktuelle Lösung das Hinzufügen des Protokollierungscodes zu jeder new(line, file)
Überladung erfordert. Außerdem können Sie es nicht einfach in Release-Builds deaktivieren, wenn Sie nicht alle Ihre Protokollierungsaufrufe innerhalb von #ifndef DEBUG ... #endif
einschließen.
Hier ist eine Möglichkeit, das zu erreichen, was Sie wollten: Anstatt den Operator new
für jede Ihrer Klassen zu überladen, sollten Sie den globalen Operator new
mit der Platzierungssyntax überladen; Auf diese Weise vermeiden Sie eine Störung des "normalen" new
-Operators. Dann können Sie #define
new hinzufügen und Makros aus Gründen der Zweckmäßigkeit löschen. Und vor allem können Sie steuern, wann Ihr Speicher-Tracking new/delete
angewendet wird und wann die Standardversion verwendet wird.
Sie sollten etwas wie sehen:
%Vor% Versuchen Sie, X
für int
zu ersetzen, und Sie werden sehen, dass es auch funktioniert. Sie können dies auch auf das Array und die Platzierung erweitern, aber ich möchte den Beitrag lieber nicht länger machen, als er ist.
Wenige letzte Hinweise am Ende:
- MSVC hat diese Funktionalität, siehe hier
- Es gibt eine Totalität, Memory-Tracking auf diese Weise zu machen hier unter der Rubrik "Tracing Memory Leaks"
Verwenden Sie dieses Makro anstelle des Standard-Zeilennummernmakros und die Überladungsauflösung unterscheidet Int
Zeilennummern von int
anderen Zahlen.
Ich kann mir nicht vorstellen, wie das in vollem Umfang funktionieren wird. Wirst du es wie int * x = NEW(int,123);
oder etwas ähnliches benutzen?
Ich stimme übrigens den Kommentatoren zu - Sie müssen wahrscheinlich nicht diesen Weg gehen. Das Überladen von new
ist etwas wie eine schwarze Kunst und sollte normalerweise vermieden werden.
Gibt es eine Möglichkeit, zur Kompilierzeit festzustellen, ob ein Vorlagenparameter eine Struktur, Klasse oder ist ein eingebauter C ++ Typ?
Sie können boos :: type_traits und boost :: mpl dafür verwenden.
Beispiel:
%Vor%Typenliste - Ссылка
Oder Sie können boost :: mpl :: set für Ihre Arten von Typen verwenden
Tags und Links memory-leaks memory c++ new-operator operator-keyword