<?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[Frage bzgl. Singleton Impl resultiert in StackOverflow Exception]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe nach dem Wikipedia BeispielCode (siehe <a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_C.2B.2B" rel="nofollow">http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B</a>)</p>
<pre><code class="language-cpp">class Singleton
   {
   private:
      static Singleton* instance;
      Singleton() {}
      Singleton(const Singleton&amp;) {}
      ~Singleton() {}
   public:
      static Singleton&amp; getInstance();
      static void destroy();
   };

   Singleton* Singleton::instance = 0;

   Singleton&amp; Singleton::getInstance()
   {
      if ( !instance )
         instance = new Singleton();
      return *instance;
   }

   void Singleton::destroy()
   {
      if ( instance )
         delete instance;
      instance = 0;
   }
</code></pre>
<p>Eine Singelton Klasse implementiert. Und nun versuche ich in meiner weiteren Klasse einer Member Variable die Referenz von getInstance im Ctor zuzuweisen.</p>
<p>D. h. Singelton getInstanz() Ref -&gt; speichern -&gt; Klassenvariable</p>
<p>Also im Header steht:<br />
Singleton* singleton;</p>
<p>CPP steht:</p>
<pre><code class="language-cpp">this-&gt;singleton=&amp;Singleton::getInstance();
</code></pre>
<p>Das Problem was ich mir dadurch einhandle ist, das in der Singleton Methode getInstance() solange new aufgerufen wird bis dann letzten Endes der Stack um die Ohren fliegt.</p>
<p>Ich wollte aus reiner Bequemlichkeit heraus die Instanz meines Singleton Objektes in meiner Arbeitsklasse vorhalten, da diese damit in x Methoden mit dem Singleton Objekt arbeiten muss.</p>
<p>Problemlos möglich ist dagegen überall Singleton::getInstance().doAnything(); aufzurufen, jedoch sobald ich diese Singleton Instanz speichern möchte kracht es eben.</p>
<p>Ich möchte gerne der Vollständigkeit wegen erfahren wieso ich mir diesen Seiteneffekt eingehandelt habe und wie ich diesen gerne vermeide.</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295151/frage-bzgl-singleton-impl-resultiert-in-stackoverflow-exception</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 13:34:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295151.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Nov 2011 08:38:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 08:38:44 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe nach dem Wikipedia BeispielCode (siehe <a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29#Implementierung_in_C.2B.2B" rel="nofollow">http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Implementierung_in_C.2B.2B</a>)</p>
<pre><code class="language-cpp">class Singleton
   {
   private:
      static Singleton* instance;
      Singleton() {}
      Singleton(const Singleton&amp;) {}
      ~Singleton() {}
   public:
      static Singleton&amp; getInstance();
      static void destroy();
   };

   Singleton* Singleton::instance = 0;

   Singleton&amp; Singleton::getInstance()
   {
      if ( !instance )
         instance = new Singleton();
      return *instance;
   }

   void Singleton::destroy()
   {
      if ( instance )
         delete instance;
      instance = 0;
   }
</code></pre>
<p>Eine Singelton Klasse implementiert. Und nun versuche ich in meiner weiteren Klasse einer Member Variable die Referenz von getInstance im Ctor zuzuweisen.</p>
<p>D. h. Singelton getInstanz() Ref -&gt; speichern -&gt; Klassenvariable</p>
<p>Also im Header steht:<br />
Singleton* singleton;</p>
<p>CPP steht:</p>
<pre><code class="language-cpp">this-&gt;singleton=&amp;Singleton::getInstance();
</code></pre>
<p>Das Problem was ich mir dadurch einhandle ist, das in der Singleton Methode getInstance() solange new aufgerufen wird bis dann letzten Endes der Stack um die Ohren fliegt.</p>
<p>Ich wollte aus reiner Bequemlichkeit heraus die Instanz meines Singleton Objektes in meiner Arbeitsklasse vorhalten, da diese damit in x Methoden mit dem Singleton Objekt arbeiten muss.</p>
<p>Problemlos möglich ist dagegen überall Singleton::getInstance().doAnything(); aufzurufen, jedoch sobald ich diese Singleton Instanz speichern möchte kracht es eben.</p>
<p>Ich möchte gerne der Vollständigkeit wegen erfahren wieso ich mir diesen Seiteneffekt eingehandelt habe und wie ich diesen gerne vermeide.</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141990</guid><dc:creator><![CDATA[Blutgerinsel]]></dc:creator><pubDate>Tue, 08 Nov 2011 08:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 08:57:42 GMT]]></title><description><![CDATA[<p>Bitte vollständigen Beispielcode. Wie greifst du darauf zu?<br />
An deinem Code seh ich jetzt nicht, was zu einem ständigen new in getInstance() führen sollte. Hast du denn dein Singleton GENAU SO gebaut? Zeig mal bitte GENAU deinen Code.</p>
<p>Nebenbei läuft das Speichern der Instanz dem eigentlichen Sinn eines Singleton etwas entgegen. Wenn du in einer Methode öfter auf den Singleton zugreifst, speicher dir doch lokal in der Funktion die Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2141998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2141998</guid><dc:creator><![CDATA[Siebenweger]]></dc:creator><pubDate>Tue, 08 Nov 2011 08:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 09:09:18 GMT]]></title><description><![CDATA[<p>Er ruft getSingleton im Konstruktor des Singleton auf. Das ist natürlich Quatsch und kann nicht gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142010</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 08 Nov 2011 09:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 09:34:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Er ruft getSingleton im Konstruktor des Singleton auf. Das ist natürlich Quatsch und kann nicht gehen.</p>
</blockquote>
<p>Sicher, eine Erklärung wäre es. Da er aber in seiner Beschreibung unterscheidet zwischen &quot;Singleton&quot; und &quot;Arbeitsklasse&quot; ging ich erstmal nicht davon aus.<br />
Genaueres kann man erst mit seinem Originalcode sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142022</guid><dc:creator><![CDATA[Siebenweger]]></dc:creator><pubDate>Tue, 08 Nov 2011 09:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 10:41:48 GMT]]></title><description><![CDATA[<p>Siebenweger schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Er ruft getSingleton im Konstruktor des Singleton auf. Das ist natürlich Quatsch und kann nicht gehen.</p>
</blockquote>
<p>Sicher, eine Erklärung wäre es. Da er aber in seiner Beschreibung unterscheidet zwischen &quot;Singleton&quot; und &quot;Arbeitsklasse&quot; ging ich erstmal nicht davon aus.<br />
Genaueres kann man erst mit seinem Originalcode sagen.</p>
</blockquote>
<p>Nein das tue ich nicht.</p>
<p>Arbeitsklasse die das Singleton verwendet:</p>
<pre><code class="language-cpp">TcpClientHandler::TcpClientHandler(string host, string port, boost::asio::io_service&amp; serv, ConnectionManager&amp; connectionManager) : service(serv) {
	//Nachfolgende Zeile stellt den Singleton dar
        this-&gt;restService=&amp;RestService::getInstance(); 

	client = new TcpClient(host, 
		port, serv, connectionManager, *this);
	tcpClient.reset(client);

	connectingInProgress = false;	
}

TcpClientHandler::~TcpClientHandler() {
}
</code></pre>
<p>Singleton Klasse aufs wesentliche reduziert:</p>
<pre><code class="language-cpp">RestService* RestService::instance = 0;

RestService::RestService()
{	
	//.....
	ioService.reset(new boost::asio::io_service());

	this-&gt;connectionManager = new ConnectionManager();

	ioServiceWork = new boost::asio::io_service::work(*ioService);

	this-&gt;tcpClientHandler = new TcpClientHandler(&quot;localhost&quot;,&quot;3333&quot;,*(ioService.get()),*this-&gt;connectionManager);

	communicationThread.reset(new boost::thread(boost::bind(&amp;RestService::runIoService,this)));

	this-&gt;tcpClientHandler-&gt;connectServerAsync();
	// component is now initialized

        ...../
}

void RestService::runIoService() {
	while(!isGoingShutdown) {
		try {
			ioService-&gt;run();
			break; // run() exited normally
		}
		catch (exception&amp; e) {
			// Deal with exception as appropriate.
			//onError(status_code_io_service_exception, e.what());
		}
	}
}

RestService&amp; RestService::getInstance()
{
	if(!instance){
		instance = new RestService();
	}
	return *instance;
}

void RestService::destroy()
{
	if(instance)
		delete instance;
	instance = 0;
}

//Restservice.h
static RestService* instance;
</code></pre>
<p>Der Lifecycle sieht folgendermaßen aus.</p>
<p>RestService wird instanziert -&gt; diese instanziert TcpClientHandler -&gt; TcpClientHandler greift auf getInstance() des RestServices zu....</p>
<p>Ich habe absichtlich im Ctor von TcpClientHandler kein Object vom Typ RestService übergeben da der RestService ohnehin ein Singleton sein muss aufgrund der Architektur. Da sonst in etlichen Unterklassen Dummy Methoden das RestService Object entsprechend weiter delegieren müssten. Außerdem darf es nur ein Objekt von RestService geben.</p>
<p>Ich könnte zwar ein Objekt von RestService im ctor übergeben allerdings besteht keine Notwendigkeit aufgrund des Singletonansatzes.</p>
<p>Evtl. spielt Threading hier noch mit rein, was ich mir eigentlich nicht vorstellen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142063</guid><dc:creator><![CDATA[Blutgerinsel]]></dc:creator><pubDate>Tue, 08 Nov 2011 10:41:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 11:12:40 GMT]]></title><description><![CDATA[<p>Blutgerinsel schrieb:</p>
<blockquote>
<p>RestService wird instanziert -&gt; diese instanziert TcpClientHandler -&gt; TcpClientHandler greift auf getInstance() des RestServices zu...</p>
</blockquote>
<p>instance_ist aber noch nicht fertig instantiiert (wird haben unsere Kette dort begonnen), weshalb instance noch immer NULL ist, wodurch wieder RestService::RestService getriggert wird, welche wiederum ein TcpClientHandler-Objekt erzeugt, welches auf RestService::getInstance zugreift, welches...</p>
<p>Ich hoffe du erkennst die Rekursion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142078</guid><dc:creator><![CDATA[Siebenweger]]></dc:creator><pubDate>Tue, 08 Nov 2011 11:12:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzgl. Singleton Impl resultiert in StackOverflow Exception on Tue, 08 Nov 2011 11:58:28 GMT]]></title><description><![CDATA[<p>Siebenweger schrieb:</p>
<blockquote>
<p>Blutgerinsel schrieb:</p>
<blockquote>
<p>RestService wird instanziert -&gt; diese instanziert TcpClientHandler -&gt; TcpClientHandler greift auf getInstance() des RestServices zu...</p>
</blockquote>
<p>instance_ist aber noch nicht fertig instantiiert (wird haben unsere Kette dort begonnen), weshalb instance noch immer NULL ist, wodurch wieder RestService::RestService getriggert wird, welche wiederum ein TcpClientHandler-Objekt erzeugt, welches auf RestService::getInstance zugreift, welches...</p>
<p>Ich hoffe du erkennst die Rekursion.</p>
</blockquote>
<p>Also wenn ich Dich richtig verstehe...</p>
<p>Dann resultiert das Problem daher, dass zum Zeitpunkt der Initalisierung des TcpClientHandlers der RestService noch nicht fertig initalisiert wurde, da der ctor noch nicht durchlaufen wurde.</p>
<p>Und deshalb funktioniert mein Methodenaufruf der Arbeitsklasse, da zu dem Zeitpunkt ein gültiges Objekt vorliegt.....</p>
<p>Wie konnte mir das nur entgehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Vielen Dank für Deine Hilfestellung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142097</guid><dc:creator><![CDATA[Blutgerinsel]]></dc:creator><pubDate>Tue, 08 Nov 2011 11:58:28 GMT</pubDate></item></channel></rss>