<?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[Segfault durch externe Definition]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe lange nicht mehr mit C++ programmiert, hoffe mein Problem ist simpel. Ich führe mein Programm (GCC 4.7.1 / -std=c++0x) aus und bekomme einen Segfault. Beim GCC 4.6.3 tritt dieser Fehler nicht auf. Ausköser ist die Funktion getEvents() in der folgenden Datei:</p>
<pre><code>// XXX.h
#include &quot;events.h&quot;

class Events;

class XXX {
protected:
   XXX();

public:
   ...
   inline Events&amp;          getEvents()          { return *events;     }

protected:
   Events          *events;
};
</code></pre>
<p>Der Debugger gibt mir dazu folgendes aus:</p>
<pre><code>Program received signal SIGSEGV, Segmentation fault.
0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
50		inline Events&amp;          getEvents()          { return *events;     }
(gdb) backtrace 
#0  0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
#1  0x080657eb in ZZZ::ZZZ (this=0x85c33a8) at ZZZ.cpp:106
...
</code></pre>
<p>XXX ist also ein Nullpointer. In der XXX.cpp steht nun folgendes:</p>
<pre><code>// XXX.cpp
#include &quot;XXX.h&quot;
#include &quot;events.h&quot;

class YYY;
extern YYY &amp;yyy;
</code></pre>
<pre><code>// YYY.cpp
#include &quot;YYY.h&quot;
// Wenn ich an folgender Stelle einen Breakpoint setze, wird hier nicht gestoppt
YYY &amp;yyy = YYY::getInstance();
</code></pre>
<pre><code>// YYY.h
#include &quot;XXX.h&quot;

class YYY : public XXX
{
   // Singleton
   ...
};

extern YYY &amp;yyy;
</code></pre>
<p>Der Auflöser in der ZZZ.cpp ist nun der Aufruf von YYY.getEvents(). Dabei ist YYY ein Nullpointer:</p>
<pre><code>#include &quot;YYY.h&quot;

ZZZ::ZZZ()
{
   YYY.getEvents();
}
</code></pre>
<p>Ich hoffe ihr könnt mir helfen. Ich bin leider recht ratlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311090/segfault-durch-externe-definition</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 00:32:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311090.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Nov 2012 18:11:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 18:11:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe lange nicht mehr mit C++ programmiert, hoffe mein Problem ist simpel. Ich führe mein Programm (GCC 4.7.1 / -std=c++0x) aus und bekomme einen Segfault. Beim GCC 4.6.3 tritt dieser Fehler nicht auf. Ausköser ist die Funktion getEvents() in der folgenden Datei:</p>
<pre><code>// XXX.h
#include &quot;events.h&quot;

class Events;

class XXX {
protected:
   XXX();

public:
   ...
   inline Events&amp;          getEvents()          { return *events;     }

protected:
   Events          *events;
};
</code></pre>
<p>Der Debugger gibt mir dazu folgendes aus:</p>
<pre><code>Program received signal SIGSEGV, Segmentation fault.
0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
50		inline Events&amp;          getEvents()          { return *events;     }
(gdb) backtrace 
#0  0x0805cc40 in XXX::getEvents (this=0x0) at XXX.h:50
#1  0x080657eb in ZZZ::ZZZ (this=0x85c33a8) at ZZZ.cpp:106
...
</code></pre>
<p>XXX ist also ein Nullpointer. In der XXX.cpp steht nun folgendes:</p>
<pre><code>// XXX.cpp
#include &quot;XXX.h&quot;
#include &quot;events.h&quot;

class YYY;
extern YYY &amp;yyy;
</code></pre>
<pre><code>// YYY.cpp
#include &quot;YYY.h&quot;
// Wenn ich an folgender Stelle einen Breakpoint setze, wird hier nicht gestoppt
YYY &amp;yyy = YYY::getInstance();
</code></pre>
<pre><code>// YYY.h
#include &quot;XXX.h&quot;

class YYY : public XXX
{
   // Singleton
   ...
};

extern YYY &amp;yyy;
</code></pre>
<p>Der Auflöser in der ZZZ.cpp ist nun der Aufruf von YYY.getEvents(). Dabei ist YYY ein Nullpointer:</p>
<pre><code>#include &quot;YYY.h&quot;

ZZZ::ZZZ()
{
   YYY.getEvents();
}
</code></pre>
<p>Ich hoffe ihr könnt mir helfen. Ich bin leider recht ratlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274876</guid><dc:creator><![CDATA[Michamab]]></dc:creator><pubDate>Mon, 26 Nov 2012 18:11:43 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 18:25:50 GMT]]></title><description><![CDATA[<p>Zeig mal YYY::getInstance().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274884</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Nov 2012 18:25:50 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 18:46:58 GMT]]></title><description><![CDATA[<pre><code>class YYY
	: public XXX
	, public Singleton&lt;YYY&gt;
{
	friend class Singleton&lt;YYY&gt;;

private:
	YYY();

public:
	virtual ~YYY();
};

extern YYY &amp;yyy;
</code></pre>
<pre><code>template &lt;class T&gt;
class Singleton {
  protected:
	Singleton() {}

  private:
	Singleton(const Singleton&amp;) {}

public:
	virtual ~Singleton() {}
	static T&amp; getInstance();

};

template &lt;class T&gt;
T&amp; Singleton&lt;T&gt;::getInstance() {
	static T instance;
	return instance;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274894</guid><dc:creator><![CDATA[Michamab]]></dc:creator><pubDate>Mon, 26 Nov 2012 18:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 19:29:46 GMT]]></title><description><![CDATA[<p>Ist das ZZZ-objekt zufällig auch global?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274916</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Nov 2012 19:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 22:37:18 GMT]]></title><description><![CDATA[<p>Hm, irgendwie hat sich das Problem gerade von alleine gelöst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ich habe eigentlich gerade nichts verändert und das Projekt neu gebaut, auf einmal lief es. So ein Mist, ich sitze schon seit dem Wochenende daran und habe es eigentlich schon mehrfach neu gebaut <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>Bzgl. deiner Frage, ja das ZZZ-Objekt ist global verfügbar und wird über ein Blackboard-Pattern verwaltet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274965</guid><dc:creator><![CDATA[Michamab]]></dc:creator><pubDate>Mon, 26 Nov 2012 22:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 22:55:22 GMT]]></title><description><![CDATA[<p>Michamab schrieb:</p>
<blockquote>
<p>ZZZ-Objekt ist global verfügbar</p>
</blockquote>
<p>Wenn ZZZ auch irgendwo globar definiert ist, dann hast du ein Problem. Denn es ist im Standard nicht definiert in welcher Reihenfolge globale Objekte über verschiedene Übersetzungseinheiten erzeugt werden.</p>
<p>Der eine machts so, der andere machts anders. Mal funktionierts, mal nicht. Be careful <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> und meide globale Objekte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274970</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Nov 2012 22:55:22 GMT</pubDate></item><item><title><![CDATA[Reply to Segfault durch externe Definition on Mon, 26 Nov 2012 22:59:19 GMT]]></title><description><![CDATA[<p>Komisches Problem mit statischen globalen Variablen, das mal da ist, mal nicht. Das ist der Lexikoneintrag für das berüchtigte &quot;static initialization order fiasco&quot;. Mit diesem Stichwort findet man bei Google leicht Erklärungen und Gegenmaßnahmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274973</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Nov 2012 22:59:19 GMT</pubDate></item></channel></rss>