<?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[virtuelle klasse und co. --&amp;gt; applikation crasht]]></title><description><![CDATA[<p>hi, ich habe folgende seltsame situation mit abstuerzen eines C++ Programms aus dem nichts:</p>
<p>(die folgende code-fragmente sind nur vereinfachte beispiele des original-codes):</p>
<p>modul bi_a.h:</p>
<pre><code>class BI_A
{
  public:
   virtual int Foo() = 0;
   virtual const std::set&lt;int&gt;&amp; GetSupportedModes(void)
   { 
     static std::set&lt;int&gt; modes;
     if (modes.empty()) { modes.insert(1); modes.insert(2); }
      return modes; 
   }
};
</code></pre>
<p>modul a.h:</p>
<pre><code>class A : public BI_A
{
  public:
     A(void);
    virtual ~A(void);
    int Foo(){return 5;}
};
</code></pre>
<p>modul a.cpp:</p>
<pre><code>A()
{
}
~A(void)
{
}
</code></pre>
<p>modul call.cpp</p>
<pre><code>void Call( void )
{
  static const bool check Get_A_Instance()-&gt;GetSupportedModes().end() != 
                          Get_A_Instance()-&gt;GetSupportedModes().find(2);
}
</code></pre>
<p>Get_A_Instance liefert mir einen Zeiger auf einen Singleton vom Typ *BI_A. Die Instanz hierzu wird bei Programmstart auf dem Heap erzeugt.</p>
<p>Das seltsame ist, dass ich manchmal bei Aufruf von Call() einen Applications-Absturz bekomme.</p>
<p>Gucke ich mir mit gdb und einem corefile den function-call trace an, sehe ich beim ersten Aufruf von GetSupportedModes() den Aufruf des A::~A() Destruktors (!!!???) <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>
<p>Zusatzinfos:</p>
<p>Die module bi_a.h und call.cpp stammen aus einer statischen Lib.<br />
module a.h und a.cpp sind eine eiegene C++ Anwendung die zur statischen Lib gelinkt wird.</p>
<p>vielleicht jemand da, der so ein konstrukt (wie oben) schonmal gesehen und probleme dazu kennt !?</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267675/virtuelle-klasse-und-co-gt-applikation-crasht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 08:44:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267675.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 May 2010 10:14:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 10:14:28 GMT]]></title><description><![CDATA[<p>hi, ich habe folgende seltsame situation mit abstuerzen eines C++ Programms aus dem nichts:</p>
<p>(die folgende code-fragmente sind nur vereinfachte beispiele des original-codes):</p>
<p>modul bi_a.h:</p>
<pre><code>class BI_A
{
  public:
   virtual int Foo() = 0;
   virtual const std::set&lt;int&gt;&amp; GetSupportedModes(void)
   { 
     static std::set&lt;int&gt; modes;
     if (modes.empty()) { modes.insert(1); modes.insert(2); }
      return modes; 
   }
};
</code></pre>
<p>modul a.h:</p>
<pre><code>class A : public BI_A
{
  public:
     A(void);
    virtual ~A(void);
    int Foo(){return 5;}
};
</code></pre>
<p>modul a.cpp:</p>
<pre><code>A()
{
}
~A(void)
{
}
</code></pre>
<p>modul call.cpp</p>
<pre><code>void Call( void )
{
  static const bool check Get_A_Instance()-&gt;GetSupportedModes().end() != 
                          Get_A_Instance()-&gt;GetSupportedModes().find(2);
}
</code></pre>
<p>Get_A_Instance liefert mir einen Zeiger auf einen Singleton vom Typ *BI_A. Die Instanz hierzu wird bei Programmstart auf dem Heap erzeugt.</p>
<p>Das seltsame ist, dass ich manchmal bei Aufruf von Call() einen Applications-Absturz bekomme.</p>
<p>Gucke ich mir mit gdb und einem corefile den function-call trace an, sehe ich beim ersten Aufruf von GetSupportedModes() den Aufruf des A::~A() Destruktors (!!!???) <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>
<p>Zusatzinfos:</p>
<p>Die module bi_a.h und call.cpp stammen aus einer statischen Lib.<br />
module a.h und a.cpp sind eine eiegene C++ Anwendung die zur statischen Lib gelinkt wird.</p>
<p>vielleicht jemand da, der so ein konstrukt (wie oben) schonmal gesehen und probleme dazu kennt !?</p>
<p>vielen dank vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903633</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Fri, 28 May 2010 10:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 10:34:11 GMT]]></title><description><![CDATA[<p>BI_A hat keinen virtuellen Destruktor, hinter <code>check</code> fehlt ein Gleichheitszeichen und ich sehe kein Singleton.</p>
<p>Achja, wenn Get_A_Instance einen Zeiger auf BI_a zurückgibt, ist die Funktion ziemlich schlecht benannt.</p>
<p>Am besten zeigst du etwas mehr Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903643</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 28 May 2010 10:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 10:44:37 GMT]]></title><description><![CDATA[<p>wie ich bereits sagte, ist dies (sehr) vereinfachter code, daher auch der syntaxfehler bei check. der virtuelle destruktor fehlt allerdings auch im original-code (der sich fehlerlos uebersetzen laesst) [muss es den geben ?].</p>
<p>das mit dem singleton kann meiner meinung nach ignoriert werden und stattdessen eine globale instanz der Klasse A angenommen werden, die beim programm-start in main(..) erzeugt wird.</p>
<p>ich weiss dass das alles vom programmiercode her vielleicht nicht ausreichend infos bereitsstellt, hatte aber gehofft es wuerde sich vielleicht um ein einfaches prob. handeln, was ich gerade uebersehe.</p>
<p>den gesamten orig.-code zu posten waere nicht angebracht.</p>
<p>falls keiner ne idee hierzu hat, auch gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903649</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Fri, 28 May 2010 10:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 10:57:42 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>wie ich bereits sagte, ist dies (sehr) vereinfachter code, daher auch der syntaxfehler bei check. der virtuelle destruktor fehlt allerdings auch im original-code (der sich fehlerlos uebersetzen laesst) [muss es den geben ?].</p>
</blockquote>
<p>Betrachte folgenden Code:</p>
<pre><code class="language-cpp">A* foo = new A();
BI_A* bar = foo;
delete bar;    // ups, hier wird nur der BI_A-Destruktor aufgerufen, weil dieser nicht virtual ist
</code></pre>
<blockquote>
<p>ich weiss dass das alles vom programmiercode her vielleicht nicht ausreichend infos bereitsstellt, hatte aber gehofft es wuerde sich vielleicht um ein einfaches prob. handeln, was ich gerade uebersehe.</p>
<p>den gesamten orig.-code zu posten waere nicht angebracht.</p>
</blockquote>
<p>Ein Stückchen mehr wäre vielleicht hilfreich (zumindest die Definitionen von allen Funktionen, die du aufrufst).</p>
<p>{Edit] Der function call trace könnte vielleicht auch noch was hergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903655</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 28 May 2010 10:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 12:01:29 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>den gesamten orig.-code zu posten waere nicht angebracht.</p>
</blockquote>
<p>Siehe Link in meiner Signatur - der ideale Code-Post hier im Forum beinhaltet das jeweilige Problem, ist dabei aber so kurz wie nur möglich und trotzdem möglichst kompilierbar. So, dass man den Code nur per Copy &amp; Paste einem beliebigen Compiler vorsetzen muss und den selben Fehler bekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903697</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 28 May 2010 12:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 12:22:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
der original source-code stammt aus einer umgebung mit mehreren dutzend modulen.<br />
das (wirkliche) problem auf ein kleines kompilierbares beispiel runterzubrechen ist hier nicht unbedingt so einfach.</p>
<p>ich hatte gehofft, dass ideen zum problem in dem von mir gesendeteten (jedoch leider nicht compilierbarem) beispiel vielleicht schon allein durchs lesen gefunden werden könnten.</p>
<p>scheint hier nicht der fall zu sein, trotzdem danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903707</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Fri, 28 May 2010 12:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 12:35:15 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>das (wirkliche) problem auf ein kleines kompilierbares beispiel runterzubrechen ist hier nicht unbedingt so einfach.</p>
</blockquote>
<p>Naja du hast es ja fast geschafft, hätten ja nurnoch 5 Minuten gefehlt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<blockquote>
<p>ich hatte gehofft, dass ideen zum problem in dem von mir gesendeteten (jedoch leider nicht compilierbarem) beispiel vielleicht schon allein durchs lesen gefunden werden könnten.</p>
</blockquote>
<p>Zwar haben einige hier auf sowas einen ziemlich guten Blick, aber nicht jeder kann &quot;im Kopf compilieren&quot; - Compilierbarer Code ist leichter zu analysieren und macht es einfacher, Tips geben zu können</p>
<blockquote>
<p>scheint hier nicht der fall zu sein, trotzdem danke.</p>
</blockquote>
<p>War der Fall. Siehe die Bemerkugnen zum fehlenden virtuellen Destruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903714</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 28 May 2010 12:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 12:48:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:</p>
<blockquote>
<p>War der Fall. Siehe die Bemerkugnen zum fehlenden virtuellen Destruktor.</p>
</blockquote>
<p>ich glaube nicht dass das die eigentlich ursache ist (leider momentan nur ne glaubenssache) ..</p>
<p>irgendwie scheint die virtual function table bei mir im arsch zu sein (irgend ne art von verpointerung) und es wird aus heiterem Himmel ein destruktor aufgerufen</p>
<p>wie gesagt, trotzdem vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903723</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Fri, 28 May 2010 12:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to virtuelle klasse und co. --&amp;gt; applikation crasht on Fri, 28 May 2010 13:04:53 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>irgendwie scheint die virtual function table bei mir im ***** zu sein (irgend ne art von verpointerung) und es wird aus heiterem Himmel ein destruktor aufgerufen</p>
</blockquote>
<p>Die vtable zerballern kann man sich folgendermaßen:</p>
<ol>
<li>Du schreibst eine Klasse V mit n virtuellen Funktionen und kompilierst ihre .cpp. In der .cpp hat die Klasse dann eine vtable der Länge n</li>
<li>Du schiebst im Header eine virtuelle Funktion irgendwo dazwischen und kompilierst einen der Klienten neu, nicht aber die .cpp der Klasse. Der Klient bestimmt für die V-Objekte die Offsets in der vtable anders, als die vtable im Konstruktor von V angelegt wird.</li>
<li>unter bestimmten Umständen linkt das Ganze trotzdem (z.B. bei DLLs) und die Klienten greifen daneben, weil die ermittelten offsets nicht mehr mit den tatsächlichen übereinstimmen.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1903732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903732</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 28 May 2010 13:04:53 GMT</pubDate></item></channel></rss>