Überladen neuer Betreiberprobleme

8

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").

    
n3XusSLO 22.07.2011, 10:07
quelle

3 Antworten

1

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.

%Vor%

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"

    
Martin Gunia 17.08.2011 11:00
quelle
0
%Vor%

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.

    
spraff 22.07.2011 12:11
quelle
0
  

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

    
kovalevfm 22.07.2011 12:24
quelle