<?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[[autorun vor main] segmentation fault]]></title><description><![CDATA[<p>Folgender Code bereitet mir Kopfweh.. Vermutlich mach ich wieder was nicht standardmäßiges... ACHTUNG: das Snippet sieht in Wirklichkeit etwas anders aus... aber ich wollte das wesentliche zeigen. Ziel ist es, dass sich diverse Singeltons VOR main bei einer Art Factory registrieren.</p>
<pre><code class="language-cpp">//header base.h
class Base
{
public:
   std::string getTypeId()=0;

   static void registerDerivedInstance(Base* inst)
   {
      myMap.insert(std::pair&lt;std::string, Base*&gt;(inst-&gt;getTypeID(), inst));
   }
private:
   static std::map&lt;std::string, Base*&gt; myMap;
};

//base.cpp
#include &quot;./base.h&quot;
std::map&lt;std::string, Base*&gt; Base::myMap;

//header derived.h
#include &quot;base.h&quot;

class Derived : public Base
{
public:
   static Derived* getInstance()
   {
      static Derived instance;
      return &amp;instance;
   }
private:
   Derived ( const Derived&amp; ); //no copy allowed 
   Derived () : Base() {}

public:
   std::string getTypeID() { return &quot;MySignature&quot;; }
};

//main.cpp
#include &quot;base.h&quot;
#include &quot;derived.h&quot;
bool test = (Base::registerDerivedInstance(Derived::getInstance()), true );

int main()
{
   Base::registerDerivedInstance(Derived::getInstance());
   return 0;
}
</code></pre>
<p>Unter Windows MSVC8.0 läuft das problemlos. Unter Linux gcc3.4.4 bekomme ich bei Programmstart einen segmentation fault.<br />
Und zwar bei myMap.insert(std::pair&lt;std::string, Base*&gt;(inst-&gt;getTypeID(), inst));<br />
ersetze ich das durch std::cout&lt;&lt;myMap.size()&lt;&lt;std::endl; geht es auch. ICh habe dann folgendes ausprobiert:</p>
<pre><code class="language-cpp">void WbWriter::registerWriterInstance(Base* nnn)
{
  static bool hack = true;
  if(hack)
  {
    std::map&lt;std::string, Base*&gt; test;
    test.insert(std::pair&lt;std::string, Base*&gt;(nnn-&gt;getTypeID(), nnn));
    myMap= test;
    std::cout&lt;&lt;WbWriter::myMap.size()&lt;&lt;&quot; &quot;&lt;&lt;nnn-&gt;getTypeID()&lt;&lt;std::endl;
    hack = false;
  }
  else myMap.insert(std::pair&lt;std::string, Base*&gt;(nnn-&gt;getTypeID(), writer));
}
</code></pre>
<p>dann erhalte ich &quot;1&quot;, &quot;1&quot;</p>
<p>Weiß jemand wo das Problem liegt? An der statischen map? Kann ich nicht immer drauf zugreifen? Die ist doch zu Programmstart schon verfügbar oder nicht?</p>
<p>Meine ganzen anderen Factories funktionen so einwandfrei. Hie rist es eine Spiezialversion, da e ssich um Singeltons handelt...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199294/autorun-vor-main-segmentation-fault</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 12:52:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199294.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Nov 2007 20:50:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [autorun vor main] segmentation fault on Fri, 30 Nov 2007 20:50:14 GMT]]></title><description><![CDATA[<p>Folgender Code bereitet mir Kopfweh.. Vermutlich mach ich wieder was nicht standardmäßiges... ACHTUNG: das Snippet sieht in Wirklichkeit etwas anders aus... aber ich wollte das wesentliche zeigen. Ziel ist es, dass sich diverse Singeltons VOR main bei einer Art Factory registrieren.</p>
<pre><code class="language-cpp">//header base.h
class Base
{
public:
   std::string getTypeId()=0;

   static void registerDerivedInstance(Base* inst)
   {
      myMap.insert(std::pair&lt;std::string, Base*&gt;(inst-&gt;getTypeID(), inst));
   }
private:
   static std::map&lt;std::string, Base*&gt; myMap;
};

//base.cpp
#include &quot;./base.h&quot;
std::map&lt;std::string, Base*&gt; Base::myMap;

//header derived.h
#include &quot;base.h&quot;

class Derived : public Base
{
public:
   static Derived* getInstance()
   {
      static Derived instance;
      return &amp;instance;
   }
private:
   Derived ( const Derived&amp; ); //no copy allowed 
   Derived () : Base() {}

public:
   std::string getTypeID() { return &quot;MySignature&quot;; }
};

//main.cpp
#include &quot;base.h&quot;
#include &quot;derived.h&quot;
bool test = (Base::registerDerivedInstance(Derived::getInstance()), true );

int main()
{
   Base::registerDerivedInstance(Derived::getInstance());
   return 0;
}
</code></pre>
<p>Unter Windows MSVC8.0 läuft das problemlos. Unter Linux gcc3.4.4 bekomme ich bei Programmstart einen segmentation fault.<br />
Und zwar bei myMap.insert(std::pair&lt;std::string, Base*&gt;(inst-&gt;getTypeID(), inst));<br />
ersetze ich das durch std::cout&lt;&lt;myMap.size()&lt;&lt;std::endl; geht es auch. ICh habe dann folgendes ausprobiert:</p>
<pre><code class="language-cpp">void WbWriter::registerWriterInstance(Base* nnn)
{
  static bool hack = true;
  if(hack)
  {
    std::map&lt;std::string, Base*&gt; test;
    test.insert(std::pair&lt;std::string, Base*&gt;(nnn-&gt;getTypeID(), nnn));
    myMap= test;
    std::cout&lt;&lt;WbWriter::myMap.size()&lt;&lt;&quot; &quot;&lt;&lt;nnn-&gt;getTypeID()&lt;&lt;std::endl;
    hack = false;
  }
  else myMap.insert(std::pair&lt;std::string, Base*&gt;(nnn-&gt;getTypeID(), writer));
}
</code></pre>
<p>dann erhalte ich &quot;1&quot;, &quot;1&quot;</p>
<p>Weiß jemand wo das Problem liegt? An der statischen map? Kann ich nicht immer drauf zugreifen? Die ist doch zu Programmstart schon verfügbar oder nicht?</p>
<p>Meine ganzen anderen Factories funktionen so einwandfrei. Hie rist es eine Spiezialversion, da e ssich um Singeltons handelt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413141</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Fri, 30 Nov 2007 20:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to [autorun vor main] segmentation fault on Sat, 01 Dec 2007 09:20:12 GMT]]></title><description><![CDATA[<p>okay. Mittlerweile habe ich noch einges ausprobiert.<br />
ich habe z.B. einen statischen Pointer auf die map verwendet.<br />
Diesen habe ich in der cpp mit new initilaisiert. ein std::cout der Adresse m Konstrukttor zeigt mit jedoch bei Ausführung &quot;VOR&quot; main als Adresse NULL an. Derselbe Aufruf in main liefert jedoch die Adresse auf eine gültige Instanz. Daher vermute ich, dass bei Aufruf der Methode VOR main einfach nicht gewährleistet ist, dass das statische Element (sei es Pointer auf ne map oder nur eine map) bereits instantiiert ist.<br />
Daher werde ich jetzt wie bei den anderen Klassen auch, einfach eine DerivedSingletonFactory erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413255</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sat, 01 Dec 2007 09:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to [autorun vor main] segmentation fault on Sat, 01 Dec 2007 09:40:39 GMT]]></title><description><![CDATA[<p>Das ist das Problem mit den statischen (globalen) Variablen: man weiß nie, in welcher Reihenfolge sie erzeugt werden (meistens kann man es über die Reihenfolge der Übersetzungseinheiten kontrollieren - aber das ist keine Garantie).<br />
Ob nun</p>
<pre><code class="language-cpp">std::map&lt;std::string, Base*&gt; Base::myMap;
</code></pre>
<p>oder zuerst</p>
<pre><code class="language-cpp">bool test = (Base::registerDerivedInstance(Derived::getInstance()), true );
</code></pre>
<p>welche ja die map benutzt, instanziiert wird, ist eben nicht festgelegt!!!</p>
<p>Erzeuge dir aus der Map selbst ein Singleton (mit Hilfe einer statischen Funktion), dann bist du auf der sicheren Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413259</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Sat, 01 Dec 2007 09:40:39 GMT</pubDate></item><item><title><![CDATA[Reply to [autorun vor main] segmentation fault on Sat, 01 Dec 2007 10:34:31 GMT]]></title><description><![CDATA[<p>okay. genau wie ich letztlich vermuted habe. mittlerweile habe ich aus der map ein singleton gemacht und es läuft wunderbar. danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413274</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sat, 01 Dec 2007 10:34:31 GMT</pubDate></item></channel></rss>