<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Automatisches Loggen im Destruktor]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab mal wieder so ne naive Vorstellung, nach der jede Klasse eine Logausgabe in ihrem Destruktor machen soll. Dazu möchte ich auch gern die Makros</p>
<pre><code class="language-cpp">__FILE__, __func__, __LINE__
</code></pre>
<p>benutzen.</p>
<p>Die Idee war, die eigentliche Ausgabe in einem Destruktor einer Basisklasse zu machen und alle anderen Klassen davon ableiten zu lassen. Nun hab ich aber gelernt, dass ein übergeordneter Destruktor erst nach dem Abarbeiten des eigenen Destruktors an die Reihe kommt.<br />
Wird denn da nicht durch den Sprung in die Basisklasse bei den Makros immer nur deren Bezug ausgegeben (also immer nur die Attribute für Zeile, Funktion und Datei dieser Basisklasse)?</p>
<p>Geht mein Vorhaben denn überhaupt, oder muss ich den Eintrag in jede Klasse einzeln aufnehmen?</p>
<p>Vielen Dank schon mal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299604/automatisches-loggen-im-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 05:13:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299604.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Feb 2012 19:42:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 19:42:54 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich hab mal wieder so ne naive Vorstellung, nach der jede Klasse eine Logausgabe in ihrem Destruktor machen soll. Dazu möchte ich auch gern die Makros</p>
<pre><code class="language-cpp">__FILE__, __func__, __LINE__
</code></pre>
<p>benutzen.</p>
<p>Die Idee war, die eigentliche Ausgabe in einem Destruktor einer Basisklasse zu machen und alle anderen Klassen davon ableiten zu lassen. Nun hab ich aber gelernt, dass ein übergeordneter Destruktor erst nach dem Abarbeiten des eigenen Destruktors an die Reihe kommt.<br />
Wird denn da nicht durch den Sprung in die Basisklasse bei den Makros immer nur deren Bezug ausgegeben (also immer nur die Attribute für Zeile, Funktion und Datei dieser Basisklasse)?</p>
<p>Geht mein Vorhaben denn überhaupt, oder muss ich den Eintrag in jede Klasse einzeln aufnehmen?</p>
<p>Vielen Dank schon mal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181199</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 14 Feb 2012 19:42:54 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 19:57:09 GMT]]></title><description><![CDATA[<p>Das sind Macros. Macros werden vom Präprozessor aufgelöst. Er weiß nichts von irgendwelchen Ableitungshierarchien. Das müsstest du schon in jede Klasse schreiben. Und ich spar mir jetzt (fast) den Kommentar, dass ich das sowieso nicht so sinnvoll finde, im Destruktor was zu loggen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181204</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Tue, 14 Feb 2012 19:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 20:00:53 GMT]]></title><description><![CDATA[<p>Makros in C++ sind reine Textersetzung, was du willst ist daher nicht möglich.<br />
Im übrigen hättest du es auch einfach ausprobieren können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181206</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 14 Feb 2012 20:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 20:35:24 GMT]]></title><description><![CDATA[<p>Also mit einer ordentlichen Basisklasse wirst Du das einigermaßen ordentlich hinkriegen.</p>
<p>Du kannst zwar nicht __FILE__ und __LINE__ des Destruktors miteinbauen, obwohl das mit üblem Getrickse auch möglich wäre.</p>
<p>Deine Log-Basisklasse übernimmt im Konstruktor als Parameter __FILE__ und __LINE__ und am besten noch den #CLASSNAME als String.</p>
<p>Du schreibst Dir dann ein Makro für den Konstruktor Deiner xy-Klasse das die Log-Basisklasse über ihren Konstruktor mit den oben angeführten Parametern intialisiert. Letzterer könnte z. B. gleich Loggen &quot;Instanz von Klasse xy, deklariert in xy.h(Zeile 4) erstellt.&quot;.</p>
<p>Der Destruktor der Basisklasse loggt dann bei Aufruf, dass die Klasse zerstört wurde.</p>
<p>Wenn Du es geschickt machst, kannst Du diese Basisklasse sich z. B. bei einer statischen Manager-Klasse registrieren lassen, die jeder Instanz einer Klasse eine Zahl zuweist, so dass du im Log z. B. verfolgen kannst, ob alle Instanzen aus dem Speicher sind. Sollte letzteres nicht der Fall sein, könnte dieser Manager das auch noch in den Log schreiben.</p>
<p>Theoretisch könntest Du auch ein Instanz Makro machen. Das würde erfordern, das jede Klasse schon im Konstruktor ein paar Logging-Parameter entgegennimmt, die sie dann die Log-Basisklasse schickt. So könnte z.B. mitgeloggt werden, wo eine Instanz gebaut wird (wieder über __FILE__ etc.).</p>
<p>Diese Makros sollten auf jeden Fall ordentlich gebaut werden, damit Du dir nicht verbaust, Klassen mit beliebig vielen Parametern, Basisklassen, beliebigem Konstruktor-Code etc. zu deklarieren.</p>
<p>Wenn Du fertig bist, schick sie mir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181227</guid><dc:creator><![CDATA[Hobo]]></dc:creator><pubDate>Tue, 14 Feb 2012 20:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 20:50:27 GMT]]></title><description><![CDATA[<p>Hobo schrieb:</p>
<blockquote>
<p>Du kannst zwar nicht __FILE__ und __LINE__ des Destruktors miteinbauen, obwohl das mit üblem Getrickse auch möglich wäre.</p>
</blockquote>
<p>Wie soll das gehen ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181232</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Tue, 14 Feb 2012 20:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Tue, 14 Feb 2012 20:57:49 GMT]]></title><description><![CDATA[<p>Zum Beispiel ein Makro, mit welchem man den Destruktor definiert, welches automatisch in der ersten Zeile des Destruktors dessen Zeilennummer an eine Funktion der Log-Basisklasse übergibt. Dass man seinen Destructor Code dann zwischen</p>
<pre><code>DESTRUCTOR_BEGIN(klassenname)

DESTRUCTOR_END
</code></pre>
<p>schreibt.</p>
<p>Aber wenn man nicht weiß, wo der Destruktor steht, dann hat man eigentlich nähere Probleme.</p>
<p>Wo der Destruktor aufgerufen wird, kann man natürlich nicht loggen, falls Du das meinst. Fällt mir jedenfalls jetzt nichts zu ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181238</guid><dc:creator><![CDATA[Hobo]]></dc:creator><pubDate>Tue, 14 Feb 2012 20:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 07:56:47 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Das sind Macros. Macros werden vom Präprozessor aufgelöst. Er weiß nichts von irgendwelchen Ableitungshierarchien. Das müsstest du schon in jede Klasse schreiben. Und ich spar mir jetzt (fast) den Kommentar, dass ich das sowieso nicht so sinnvoll finde, im Destruktor was zu loggen.</p>
</blockquote>
<p>Dito. im dtor legt sich das Objekt zur Ruhe. Es ist eine sehr emotionale Phase des Objekts und sollte sich ausschließlich mit der Auflösung des Speichers befassen.<br />
Scherz, nein das Problem des dtors ist, dass es keine Rückgabewerte gibt und man eigentlich etwas abgeschottet ist. Es kann ja sein, dass dein Logger kaputt ist (Festplatte voll, Stream unterbrochen, etc...), und du kannst darauf nicht reagieren. Da bau lieber eine Methode void terminate(), die delete this; aufruft und davor loggt.</p>
<p>Zu den Makros: __FILE__ und __LINE__ sind welche und werden VOR Laufzeit vom Präprozessor mit den Werten ersetzt. Also wenn du eine Basisklasse mit den Makros benutzt und meinst du kannst die vererben, dann wird __FILE__ und __LINE__ immer die gleichen Werte haben, nämlich an der Stelle im Code wo sie auch stehen auch nach der 100 Vererbungsebene</p>
<pre><code class="language-cpp">// A.h
class A : public MyDtorLogger{ };
class B : public MyDtorLogger{ };

// main.cpp
int main() {
A *a = new A;
B *b = new B;

// ...

delete a; // --&gt; Ausgabe: Dtor of .../MyDtorLogger.cpp line 20 wurde ausgeführt

// ...
delete b; // --&gt; Ausgabe: Dtor of .../MyDtorLogger.cpp line 20 wurde ausgeführt
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2181306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181306</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Wed, 15 Feb 2012 07:56:47 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 09:35:11 GMT]]></title><description><![CDATA[<p>PhilippHToner schrieb:</p>
<blockquote>
<p>Es kann ja sein, dass dein Logger kaputt ist (Festplatte voll, Stream unterbrochen, etc...), und du kannst darauf nicht reagieren. Da bau lieber eine Methode void terminate(), die delete this; aufruft und davor loggt.</p>
</blockquote>
<p>So ein Blödsinn.<br />
Wie willst du denn überhaupt <em>irgendwo</em> auf Logging-Probleme reagieren? Eine Fehlermeldung Loggen? Oder das Programm abbrechen weil nimmer geloggt werden kann? (OK, das KANN für manche Programme Sinn machen, kann man aber auch super im Dtor triggern)<br />
Oder ne Exception werfen, den aktuellen Vorgang abbrechen, was dann erst wieder dazu führt dass alle möglichen Objekte zerstört werden?</p>
<p>Nene, also loggen kann man im Dtor problemlos. Denn man sollte verdammtnochmal sicherstellen, dass die Logging Funktionen nie nie nie Exceptions werfen.<br />
(Bzw. an den nötigen Stellen Exceptions die beim Zusammenbau von Log-Messages immer mal wieder vorkommen können gefälligst zu fangen)</p>
<p>Achja: Fehlerbehandlung beim Loggen: ignorieren. Ich denke das hätte sich mittlerweile rumgesprochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181335</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 15 Feb 2012 09:35:11 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 09:38:19 GMT]]></title><description><![CDATA[<p>Ich würde sogar so weit gehen, und sagen, Fehler im Dtor generell zu ignorieren, da man sie nicht vernünftig behandeln kann. Wenn eine Datei nicht geschlossen werden kann, dann ist mir das vollkommen egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181341</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 15 Feb 2012 09:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 09:41:32 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>PhilippHToner schrieb:</p>
<blockquote>
<p>Es kann ja sein, dass dein Logger kaputt ist (Festplatte voll, Stream unterbrochen, etc...), und du kannst darauf nicht reagieren. Da bau lieber eine Methode void terminate(), die delete this; aufruft und davor loggt.</p>
</blockquote>
<p>So ein Blödsinn.<br />
Wie willst du denn überhaupt auf Logging-Probleme reagieren? Eine Fehlermeldung Loggen?</p>
</blockquote>
<p>Er könnte dir n Datagramm mit &quot;HELP&quot; und seinen Koordinaten senden?<br />
Vielleicht einfach der Fehlerbehandlungsstrategie nachgehen, die das Projekt vorsieht? Ich kann komplett unabhängig einen anderen Prozess starten, der sich um den Fehler kümmern soll und das aktuelle Programm soll terminieren. Der andere Prozess zeigt den Fehler z.B. in Form einer Fehlermeldung mit GUI an. Und wenn alle Stricke reißen gibt's vielleicht OS-Routinen, die sich damit besser auseinandersetzen inkl. Prozessdump oder ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181345</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Wed, 15 Feb 2012 09:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 11:03:03 GMT]]></title><description><![CDATA[<p>PhilippHToner schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>PhilippHToner schrieb:</p>
<blockquote>
<p>Es kann ja sein, dass dein Logger kaputt ist (Festplatte voll, Stream unterbrochen, etc...), und du kannst darauf nicht reagieren. Da bau lieber eine Methode void terminate(), die delete this; aufruft und davor loggt.</p>
</blockquote>
<p>So ein Blödsinn.<br />
Wie willst du denn überhaupt auf Logging-Probleme reagieren? Eine Fehlermeldung Loggen?</p>
</blockquote>
<p>Er könnte dir n Datagramm mit &quot;HELP&quot; und seinen Koordinaten senden?<br />
Vielleicht einfach der Fehlerbehandlungsstrategie nachgehen, die das Projekt vorsieht? Ich kann komplett unabhängig einen anderen Prozess starten, der sich um den Fehler kümmern soll und das aktuelle Programm soll terminieren. Der andere Prozess zeigt den Fehler z.B. in Form einer Fehlermeldung mit GUI an. Und wenn alle Stricke reißen gibt's vielleicht OS-Routinen, die sich damit besser auseinandersetzen inkl. Prozessdump oder ähnlich.</p>
</blockquote>
<p>Gut.<br />
Und genau wieso soll das jetzt nicht gehen wenn die Logging Funktionen aus einem Dtor aufgerufen werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181374</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 15 Feb 2012 11:03:03 GMT</pubDate></item><item><title><![CDATA[Reply to Automatisches Loggen im Destruktor on Wed, 15 Feb 2012 11:19:05 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Gut.<br />
Und genau wieso soll das jetzt nicht gehen wenn die Logging Funktionen aus einem Dtor aufgerufen werden?</p>
</blockquote>
<p>Ganz ehrlich, das ist denk ich Geschmackssache wie es geimplt wird. Ich für meinen Teil finde, dass der Dtor wie gesagt alles was sich das Objekt &quot;geliehen&quot; hat, sei es Speicher oder öffene Dateien, freigibt und schließt. Wenn hier ein Fehler auftritt, dann sei es so, aber was soll schon im Dtor passieren? Wenn man hier vernüftig z.B. die Pointer nach dem Löschen NULL setzt und vor dem Löschen prüft sollte eigentlich alles getuned sein. Wenn eine Datei, wie es 314159 gesagt hat sich nicht mehr schließen lässt, dann halt nicht, ist nur die nette Geste. Aber Datei öffnen ist schon wieder schlecht finde ist. Ich würde halt niemals in einen Dtor eine weitere Verzweigung sonstwohin einbauen, also auch kein Loggen. Wer Lust hat es dennoch zu, who cares...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181377</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Wed, 15 Feb 2012 11:19:05 GMT</pubDate></item></channel></rss>