<?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 doppeltem destruktor-aufruf]]></title><description><![CDATA[<p>hallo leut,<br />
folgendes problem (hoffe habt ne idee):</p>
<p>a.h:</p>
<pre><code>class A
{
 static libtype s_lib;
};
</code></pre>
<p>a.cpp:</p>
<pre><code>#include &lt;a.h&gt;
libtype A::s_lib;
</code></pre>
<p>b.h:</p>
<pre><code>#include &lt;a.h&gt;
class B
{
 public:
 void SomeFunction();
 static libtype B::s_lib;

};
</code></pre>
<p>b.cpp:</p>
<pre><code>#include &lt;b.h&gt;
libtype B::s_lib;
void B::SomeFunction()
{
 ...
}
</code></pre>
<p>main.cpp:</p>
<pre><code>#include &lt;b.h&gt;
int main(int argc, char *argv[])
{
 A a;
 B b;
 b.SomeFunction();
 return 0;
}
</code></pre>
<p>Das Problem ist, dass der Destruktor der statischen Member A::s_lib bei Beendigung von main.cpp zweimal aufgerufen wird (es handelt sich um einen destruktor einer library), und dieser destruktor schmeisst eine assertion<br />
falls das objekt schoneinmal destruiert wurde.</p>
<p>Warum der doppelte Destruktor Aufruf und wie koennte man sowas verhindern (einen Zeiger zu verwenden und diesen bei Destruierung auf NULL zu setzen um beim naechsten mal zu schauen ob dieser bereits auf NULL gesetzt wurde, solle keine option sein)</p>
<p>danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/254995/problem-mit-doppeltem-destruktor-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 06:58:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254995.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Nov 2009 09:35:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 09:35:21 GMT]]></title><description><![CDATA[<p>hallo leut,<br />
folgendes problem (hoffe habt ne idee):</p>
<p>a.h:</p>
<pre><code>class A
{
 static libtype s_lib;
};
</code></pre>
<p>a.cpp:</p>
<pre><code>#include &lt;a.h&gt;
libtype A::s_lib;
</code></pre>
<p>b.h:</p>
<pre><code>#include &lt;a.h&gt;
class B
{
 public:
 void SomeFunction();
 static libtype B::s_lib;

};
</code></pre>
<p>b.cpp:</p>
<pre><code>#include &lt;b.h&gt;
libtype B::s_lib;
void B::SomeFunction()
{
 ...
}
</code></pre>
<p>main.cpp:</p>
<pre><code>#include &lt;b.h&gt;
int main(int argc, char *argv[])
{
 A a;
 B b;
 b.SomeFunction();
 return 0;
}
</code></pre>
<p>Das Problem ist, dass der Destruktor der statischen Member A::s_lib bei Beendigung von main.cpp zweimal aufgerufen wird (es handelt sich um einen destruktor einer library), und dieser destruktor schmeisst eine assertion<br />
falls das objekt schoneinmal destruiert wurde.</p>
<p>Warum der doppelte Destruktor Aufruf und wie koennte man sowas verhindern (einen Zeiger zu verwenden und diesen bei Destruierung auf NULL zu setzen um beim naechsten mal zu schauen ob dieser bereits auf NULL gesetzt wurde, solle keine option sein)</p>
<p>danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812770</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 24 Nov 2009 09:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 09:43:35 GMT]]></title><description><![CDATA[<p>Du kannst anscheinend nicht mehrere Instanzen von <code>libtype</code> anlegen, weil irgendwelche Ressourcen in der lib geteilt werden.<br />
Dein Programm darf also nur eine Instanz von <code>libtype</code> benutzen.<br />
Der doppelte Dtor aufruf kommt, weil der Dtor von libtype einmal von <code>A::s_lib</code> und einmal von <code>B::s_lib</code> aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812777</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 24 Nov 2009 09:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 09:47:03 GMT]]></title><description><![CDATA[<p>sicher das das der grund sein soll?</p>
<p>es sind ja zwei verschiedene instanzen (nur vom gleichem typ).<br />
das problem ist der zweimalige aufruf des destruktor einer (!) instanz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812778</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 24 Nov 2009 09:47:03 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 09:56:58 GMT]]></title><description><![CDATA[<p>Ja ziemlich. Das wird irgendwie so aussehen:</p>
<pre><code class="language-cpp">//in der lib

void initSystem() //irgendwas in der lib, dass nur einmal beim start aufgerufen werden darf
{
    //hier werden z.B. irgendwelche globalen heapobjekte angelegt
}

void shutdwonSystem() //irgendwas in der lib, dass nur einmal beim beenden aufgerufen werden darf
{
    //hier wird aufgeräumt
}

//darf nur einmal instaziiert werden, sollte also besser ein singleton sein
//ist es aber nicht. daher das problem
class libtype 
{
public:
    libtype(){ initSystem(); }
    ~libtype(){ shutdwonSystem(); }
};

//client code

#include &lt;libtype_interface.h&gt;

int main()
{
    libtype A;
    libtype B;
    //...

    //Dtor von B -&gt; okay
    //Dtor von A -&gt; boing (es wird aufgeräumt, was schon aufgeräumt wurde)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1812781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812781</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 24 Nov 2009 09:56:58 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 10:00:53 GMT]]></title><description><![CDATA[<p>so einfach ist das glaube ich nicht.</p>
<p>bei dem besagten libtype handelt es sich in meiner app genauer um eine boost-scope-lock instanz (falls jemand das kennen sollte).</p>
<p>ein singleton ist hier kein option, ich brauche definitiv zwei instanzen.</p>
<p>der grund (und eine moegliche loesung) fuer die doppelte zerstoerung einer dieser beiden statischen member ist also immer noch offen :))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812783</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 24 Nov 2009 10:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 10:24:29 GMT]]></title><description><![CDATA[<p>Wie wäre es denn damit, wenn Du mal konkreten Code rausrückst. Ich wette, wenn Du in Deinem Beispiel oben in A <em>oder</em> B die libtype Instanz weglässt, dann geht es, weil nur einmal etwas aufgerufen wird, dass nur einmal aufgerufen werden darf.<br />
Und boost::scoped_lock ist eben gerade für die Benutzung in einem <em>Scope</em> gedacht. Das widerspricht der Benutzung als globales statisches Objekt aber komplett. Vermutlich wird im unterliegenden Mutex <code>unlock</code> aufgerufen, und der aufrufende Thread ist nicht der Owner (also der Thread der vorher auch lock aufgerufen hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812785</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 24 Nov 2009 10:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit doppeltem destruktor-aufruf on Tue, 24 Nov 2009 10:58:28 GMT]]></title><description><![CDATA[<p>wens interessiert: ein pragma ones in b.h loest das problem.<br />
trotzdem danke fuer alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1812800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1812800</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Tue, 24 Nov 2009 10:58:28 GMT</pubDate></item></channel></rss>