Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.08.2011, 15:44

C++ Kompilieren bedingt abbrechen

Hallo liebe C++ Programmierer,

ich programmiere Momentan eine Speicherklasse, die Speicherlecks durch die Verwendung von "new" verhindern soll. Die wichtigstem Elemente der Klasse:

  • Eine Membervariable (anfangs auf 0 gesetzt) die anzeigt, wie oft speicher Reserviert wurde
  • Funktion zum reservieren von Speicher (erhöht die Membervariable um 1)
  • Funktion zum freigeben von Speicher (erniedrigt die Membervariable um 1)
  • Destruktor, der prüft ob die Membervariable 0 ist. Wenn nein, dann kompiliervorgang abbrechen

Wie man schon an dem Fettgedrucktem Teil erkennen kann, ist meine Frage nun: Wie teilt man dem Compiler mit, falls die Membervariable nicht 0 ist, dass er den Kompiliervorgang doch bitte abbrechen möchte?

C-/C++-Quelltext

1
2
3
#if Membervariable != 0
#error "Noch nicht freigegebener Speicher vorhanden!"
#endif


So kann es ja nicht funktionieren, da der Kompiler ja erst die Präprozessor-Direktiven prüft und dann mit der Übersetzung des Quellcodes fortfährt.
Gibt es überhaupt eine Möglichkeit, das Programm so abzubrechen oder muss ich die Memorylecks in kauf nehmen und einfach eine Warnung mit "cerr" ausgeben, dass nicht freigegebener Speicher vorhanden ist?

Vielen Dank schon mal für eure Hilfe

Grüße bennichamp :)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

08.08.2011, 17:41

Kurze Zwischenfrage: machst du das ganze rein interessehalber von Hand? Denn immerhin gibt es ja eine Vielzahl von fertigen Lösungen. Sowohl für VS als auch unter Linux/Unix Systemen kann ich dir direkt entsprechende liefern. Nebenbei ist das Suchen und Finden von Speicherlecks eine Geschichte des Entwicklungsprozess und für den Endnutzer sollte möglichst eine Version existieren, die möglichst keine Speicherlecks hat, womit auch das Suchen danach unsinnig sein sollte.

Prinzipiell könntest du einfach eine Exception werfen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

08.08.2011, 19:25

Hey,

danke für deine Antwort :D

Rein Interesshalber... Mittlerweile gibt es ja für alles eine Vorgefertigte Lösung in C++ :S
Das Suchen nach den Lecks ist ja auch nur für den Entwicklungsprozess gedacht und nicht für den Endnutzer (der würde ja erst mal spartanisch schauen wenn au einmal eine Meldung, "Achtung! Speicherlecks vorhanden", erscheint ;) ) und es könnte ja wieder mit Präprozessor-Direktiven -je nach Build- aktiviert-bzw. deaktiviert werden.
Wie würdest du die Exeption werfen und geschieht dass zur Laufzeit (try und catch) ode beim kompillieren?

Grüße benni :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

08.08.2011, 19:47

Verstehe ich das richtig, dass Du möchtest, dass der Compiler abbricht, wenn eine bestimmte Variable 0 ist?
Falls ja: Das geht überhaupt nicht, weil der Compiler dies nicht erkennen kann, da er doch seine Arbeit erledigt, bevor das Programm überhaupt ausgeführt wird. Den Kompiliervorgang abbrechen kannst Du nur dann, wenn die Bedingung schon zur Kompilierzeit (und nicht erst zur Laufzeit) auswertbar ist. Stell Dir einfach mal vor, dass der Wert Deiner Variablen von der Eingabe des Benutzers abhängt. Der Compiler hat keine Kristallkugel und kann darum nicht wissen, was der Benutzer eingeben wird.

5

08.08.2011, 20:11

Ja, das war auch mein Gedanke, desswegen war ich skeptisch ob das über haupt geht :S .
Aber dann hat sich das Thema eh erledigt...

Danke für eure Antworten @Nox und @David Sherfgen :thumbsup:

Grüße benni :)

Werbeanzeige