<?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[problem mit statischen globalen variablen]]></title><description><![CDATA[<p>hallo,</p>
<p>ich wuerd mich freuen, falls jemand eine idee zu folgendem problem haette:</p>
<p>wir entwickeln in unserer firma eine c++ bibliothek. innerhalb dieser sind für bestimmte klassen singleton implementierungen vorhanden, wobei das singleton pattern so umgesetzt wurde, dass über eine GetInstance() methode der jeweiligen klasse eine lokale statische variable zurückgeliefert wird, in etwa wie:</p>
<pre><code>Klasse&amp; Klasse::GetInstance()
{
   static instanz;
   return instanz;
}
</code></pre>
<p>Nun ist es so, dass zusaetzlich zu obigem log4cxx verwendet wird und die logger statische globale variablen sind, in etwa z.B. in modul.cpp:</p>
<pre><code>static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger(&quot;MyLogger&quot;));
Klasse::~Klasse()
{
  Info(logger, &quot;Klasse wird destruiert..&quot;);
}
</code></pre>
<p>geloggt wird hierbei unter anderem auch in den destruktoren der besagten singleton instanzen.</p>
<p>Bei implementierung einer konsolen-anwendung, die die obige bibliothek verwendet, kommt es dazu, dass am ende der anwendung es (zumindest unter dem BSD betriebssystem) zu einer segmentation fault kommt, undzwar genau am ende der applikation.</p>
<p>nun meine frage:<br />
die besagten logger-instanzen sind in der besagten bibliothek an einigen stellen global und statisch (leider alter code und es gibt viele stellen). es scheint so, als ob diese am ende der anwendung destruiert werden, obwohl danach noch andere objekte (die singletons) in ihren destruktoren noch am loggen sind.<br />
kann man hierraus folgern dass man eine andere loesung fuer die statischen globalen logger finden muss, da man ja nicht garantieren kann in welcher reihenfolge diese am ende der anwendung destruiert werden (zuerst die singletons oder die logger) ???</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320084/problem-mit-statischen-globalen-variablen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 14:51:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320084.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Sep 2013 19:38:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 19:38:26 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ich wuerd mich freuen, falls jemand eine idee zu folgendem problem haette:</p>
<p>wir entwickeln in unserer firma eine c++ bibliothek. innerhalb dieser sind für bestimmte klassen singleton implementierungen vorhanden, wobei das singleton pattern so umgesetzt wurde, dass über eine GetInstance() methode der jeweiligen klasse eine lokale statische variable zurückgeliefert wird, in etwa wie:</p>
<pre><code>Klasse&amp; Klasse::GetInstance()
{
   static instanz;
   return instanz;
}
</code></pre>
<p>Nun ist es so, dass zusaetzlich zu obigem log4cxx verwendet wird und die logger statische globale variablen sind, in etwa z.B. in modul.cpp:</p>
<pre><code>static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger(&quot;MyLogger&quot;));
Klasse::~Klasse()
{
  Info(logger, &quot;Klasse wird destruiert..&quot;);
}
</code></pre>
<p>geloggt wird hierbei unter anderem auch in den destruktoren der besagten singleton instanzen.</p>
<p>Bei implementierung einer konsolen-anwendung, die die obige bibliothek verwendet, kommt es dazu, dass am ende der anwendung es (zumindest unter dem BSD betriebssystem) zu einer segmentation fault kommt, undzwar genau am ende der applikation.</p>
<p>nun meine frage:<br />
die besagten logger-instanzen sind in der besagten bibliothek an einigen stellen global und statisch (leider alter code und es gibt viele stellen). es scheint so, als ob diese am ende der anwendung destruiert werden, obwohl danach noch andere objekte (die singletons) in ihren destruktoren noch am loggen sind.<br />
kann man hierraus folgern dass man eine andere loesung fuer die statischen globalen logger finden muss, da man ja nicht garantieren kann in welcher reihenfolge diese am ende der anwendung destruiert werden (zuerst die singletons oder die logger) ???</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352810</guid><dc:creator><![CDATA[teddybaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 19:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 20:23:41 GMT]]></title><description><![CDATA[<p>teddybaer schrieb:</p>
<blockquote>
<p>nun meine frage:<br />
(...)<br />
kann man hierraus folgern dass man eine andere loesung fuer die statischen globalen logger finden muss, da man ja nicht garantieren kann in welcher reihenfolge diese am ende der anwendung destruiert werden (zuerst die singletons oder die logger) ???</p>
</blockquote>
<p>Jain.</p>
<p>Man kann soweit ich weiss die Reihenfolge schon garantieren, aber halt nicht garantieren dass man eine &quot;passende&quot; Reihenfolge bekommt.<br />
Wenn ich mich nicht irre werden function-local-statics (das was ihr verwendet) in der umgekehrten Reihenfolge zerstört wie sie konstruiert wurden.<br />
(OK, sieht so aus als ob ich mich hier richtig erinnert habe: <a href="http://stackoverflow.com/questions/469597/destruction-order-of-static-objects-in-c" rel="nofollow">http://stackoverflow.com/questions/469597/destruction-order-of-static-objects-in-c</a> )</p>
<p>Dummerweise ist das aber die falsche Reihenfolge, wenn z.B. in einem Konstruktor eines statischen Objekts das erste mal auf einen Logger zugegriffen wird.<br />
Der Konstruktor des statischen Objekts wurd dann ja als erster aufgerufen, und dann erst der Konstruktor des Loggers. Also wird - umgekehrte Reihenfolge - der Logger zuerst zerstört =&gt; BOOM.<br />
(Wobei ich mir hier wieder nicht sicher bin - nämlich welcher Zeitpunkt für das &quot;reverse order&quot; Zerstören als Konstuktionszeitpunkt gilt -- der wo der Konstruktor des Objekts anfängt oder der wo er beendet ist. Wenn zweiteres, dann würde die Reihenfolge in dem Fall sogar passen.)</p>
<p>EDIT: Ich hab das mal kurz ausprobiert... der aktuell von <a href="http://ideone.com" rel="nofollow">ideone.com</a> verwendete Compiler nimmt den Zeitpunkt wo die Konstuktion abgeschlossen wurde: <a href="http://ideone.com/rnEqaT" rel="nofollow">http://ideone.com/rnEqaT</a><br />
Das wäre in diesem Fall ja die passende Reihenfolge.<br />
Ob der Standard das so vorschreibt weiss ich nicht. /EDIT</p>
<p>----</p>
<p>Das ganze ist ein altes Problem, und du wirst viele Artikel zu dem Thema finden wenn du mit &quot;static initialization order fiasco&quot; bzw. &quot;static destruction order fiasco&quot; suchst.</p>
<p>Ein paar (mehr oder weniger) übliche Lösungen die mir auf die Schnelle einfallen:</p>
<p>* Logger per &quot;new&quot; anlegen und nie zerstören.</p>
<p>* Logger nicht direkt global machen, sondern nur <code>shared_ptr&lt;Logger&gt;</code> als globale Variable. Alle Objekte die einen bestimmten Logger verwenden wollen müssen dann einen <code>shared_ptr&lt;Logger&gt;</code> auf diesen Logger halten, und über diesen zugreifen. Dadurch wird der Logger erst zerstört nachdem alle &quot;User&quot; des Loggers zerstört wurden.</p>
<p>* Alle nicht-Logger Singletons entfernen.</p>
<p>* Überhaupt alle Singletons entfernen.</p>
<p>* Alle nicht-Logger Singletons durch eine Singleton Implementierung ersetzen die eine &quot;zerstör es jetzt&quot; Funktion hat, die man dann vor Beendigung des Programms aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352816</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 20:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 20:27:08 GMT]]></title><description><![CDATA[<p>ja, so etwas in der art hatte ich schon befuerchtet.<br />
vielen dank fuer die umfangreiche antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352819</guid><dc:creator><![CDATA[teddybaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 20:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 20:33:58 GMT]]></title><description><![CDATA[<p>Falls das oben erwähnte Verhalten standard ist, und auch von eurem Compiler so umgesetzt wird, dann sollte es vorerst mal reichen, in allen Klassen wo der Destruktor loggt, auch im Konstruktor auf den (selben) Logger zuzugreifen.</p>
<p>Dazu muss man im Konstruktor nichtmal loggen, ein einfaches &quot;get logger&quot; wäre ausreichend.<br />
(D.h. ausser die Logging-Lib verwendet intern noch weitere local statics, z.B. für Log-Writer, die erst angelegt werden wenn man wirklich was loggt. In dem Fall müsste man dann im Konstruktor wirklich ne Log-Ausgabe machen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352821</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 20:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 21:49:05 GMT]]></title><description><![CDATA[<p>ich glaube wir werden eher die shared_ptr variante fahren.<br />
aber das mit deinem kommentar zum einfuegen einer logg-anweisung<br />
in den konstruktor der singletons verstehe ich nicht so recht:</p>
<p>[code]<br />
SingletonConstructor()<br />
{<br />
Info(logger, &quot;log was&quot;);<br />
}<br />
[\code]</p>
<p>du meinst es waere ggf. moeglich dass hier die konstruktionsreihenfolge<br />
1. logger<br />
2. Singleton<br />
gelten koennte und demnach die destruktion:<br />
1. Singleton<br />
2. logger<br />
folgt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352830</guid><dc:creator><![CDATA[teddybaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 21:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 21:53:04 GMT]]></title><description><![CDATA[<p>noch eine anmerkung:</p>
<p>das beispiel auf <a href="http://ideone.com/rnEqaT" rel="nofollow">http://ideone.com/rnEqaT</a><br />
verwendet fuer beide objekte lokale statische variablen.</p>
<p>in meinem beispiel waere aber eine der beiden variablen<br />
eine globale statische variable.</p>
<p>ich hoffe das macht keinen unterschied ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352831</guid><dc:creator><![CDATA[teddybaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 21:53:04 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit statischen globalen variablen on Sun, 15 Sep 2013 22:39:21 GMT]]></title><description><![CDATA[<p>Oh ich bin so doof.<br />
Ich hab übersehen dass <code>LoggerPtr</code> ja dem Namen nach vermutlich bereits ein Zeiger ist. Und vermutlich (hoffentlich) einer mit Reference-Counting.</p>
<p>Also brauchst du keine <code>shared_ptr</code> , kopier einfach den <code>LoggerPtr</code> als <code>LoggerPtr</code> in das Objekt =&gt; Problem gelöst.</p>
<p>teddybaer schrieb:</p>
<blockquote>
<p>noch eine anmerkung:</p>
<p>das beispiel auf <a href="http://ideone.com/rnEqaT" rel="nofollow">http://ideone.com/rnEqaT</a><br />
verwendet fuer beide objekte lokale statische variablen.</p>
<p>in meinem beispiel waere aber eine der beiden variablen<br />
eine globale statische variable.</p>
<p>ich hoffe das macht keinen unterschied ?</p>
</blockquote>
<p>Doch, das würde einen Unterschied machen. Hab ich übersehen. Aber wie gesagt: kopier einfach den <code>LoggerPtr</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2352839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2352839</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 15 Sep 2013 22:39:21 GMT</pubDate></item></channel></rss>