<?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[&amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member]]></title><description><![CDATA[<p>Folgendes Beispiel</p>
<pre><code class="language-cpp">using namespace std;

template&lt;typename T&gt;
class foo
{
public:

	foo()
	{
		v.push_back(this);
	}

	static vector&lt;foo&lt;T&gt;*&gt; v;
};

template&lt;typename T&gt;
vector&lt;foo&lt;T&gt;*&gt; foo&lt;T&gt;::v;

foo&lt;int&gt; f;

int main()
{
}
</code></pre>
<p>liefert mir (VS 2008) beim Starten den Fehler &quot;Die Ausnahme &quot;Unbekannter Softwarefehler&quot; (0xc0000417) ist in der Anwendung an der Stelle 0x7858ccb5 aufgetreten.&quot;. Nach ein bisschen Debuggen fand ich heraus, dass das <code>push_back</code> fehlschlägt, konkreter ein <code>return begin();</code> im durch <code>push_back</code> aufgerufenem <code>insert</code> . Ich vermute deshalb, dass <code>v</code> zum Zeitpunkt des Konstruktoraufrufes noch nicht vollständig konstruiert ist.<br />
Dieser Fehler tritt nur auf, wenn <code>foo</code> eine Templateklasse ist und <code>f</code> eine globale Variable. Ich war aber bisher der Meinung, dass statische Member vor dem Konstruktor konstruiert sind.</p>
<p>Deshalb meine Frage: gibt es für dieses Verhalten einen Grund (im Standard festgelegt), mache ich eventuell etwas falsch, oder ist hier gar ein Bug im VS (andere Compiler konnte ich leider nicht testen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267716/quot-unbekannter-softwarefehler-quot-bei-globaler-variable-einer-templateklasse-mit-statischem-member</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 07:10:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267716.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 May 2010 21:46:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Fri, 28 May 2010 21:46:01 GMT]]></title><description><![CDATA[<p>Folgendes Beispiel</p>
<pre><code class="language-cpp">using namespace std;

template&lt;typename T&gt;
class foo
{
public:

	foo()
	{
		v.push_back(this);
	}

	static vector&lt;foo&lt;T&gt;*&gt; v;
};

template&lt;typename T&gt;
vector&lt;foo&lt;T&gt;*&gt; foo&lt;T&gt;::v;

foo&lt;int&gt; f;

int main()
{
}
</code></pre>
<p>liefert mir (VS 2008) beim Starten den Fehler &quot;Die Ausnahme &quot;Unbekannter Softwarefehler&quot; (0xc0000417) ist in der Anwendung an der Stelle 0x7858ccb5 aufgetreten.&quot;. Nach ein bisschen Debuggen fand ich heraus, dass das <code>push_back</code> fehlschlägt, konkreter ein <code>return begin();</code> im durch <code>push_back</code> aufgerufenem <code>insert</code> . Ich vermute deshalb, dass <code>v</code> zum Zeitpunkt des Konstruktoraufrufes noch nicht vollständig konstruiert ist.<br />
Dieser Fehler tritt nur auf, wenn <code>foo</code> eine Templateklasse ist und <code>f</code> eine globale Variable. Ich war aber bisher der Meinung, dass statische Member vor dem Konstruktor konstruiert sind.</p>
<p>Deshalb meine Frage: gibt es für dieses Verhalten einen Grund (im Standard festgelegt), mache ich eventuell etwas falsch, oder ist hier gar ein Bug im VS (andere Compiler konnte ich leider nicht testen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903916</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 28 May 2010 21:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Fri, 28 May 2010 22:04:10 GMT]]></title><description><![CDATA[<p>Dein Code läuft zumindest bei mir unter Visual Studio 2010.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903920</guid><dc:creator><![CDATA[...]]></dc:creator><pubDate>Fri, 28 May 2010 22:04:10 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Sat, 29 May 2010 07:05:53 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Deshalb meine Frage: gibt es für dieses Verhalten einen Grund (im Standard festgelegt)</p>
</blockquote>
<p>Ja - d.h., das Verhalten ist potentiell undefiniert, weil die Reihenfolge der Instantiierung von f und foo&lt;int&gt;::v unspezifiziert ist.<br />
Siehe auch <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#362" rel="nofollow">Order of initialization in instantiation units</a></p>
<p>Obiger Code kann funktionieren, z.B. dann, wenn die Initialisierung von v statisch durchgeführt wird. Oder aber die Initilisierung passiert gerade zufällig in der gewünschten Reihenfolge.</p>
<p>Jedenfalls müsstest du, um das gewünschte Verhalten mit Sicherheit zu erreichen, foo&lt;int&gt;::v zuvor explizit instantiieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903981</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 29 May 2010 07:05:53 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Sat, 29 May 2010 08:46:01 GMT]]></title><description><![CDATA[<p>Vielen Dank, camper, das beantwortet schon mal einiges. <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="🙂"
    /></p>
<p>camper schrieb:</p>
<blockquote>
<p>Jedenfalls müsstest du, um das gewünschte Verhalten mit Sicherheit zu erreichen, foo&lt;int&gt;::v zuvor explizit instantiieren.</p>
</blockquote>
<p>Doofe Frage: wie mache ich das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904004</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sat, 29 May 2010 08:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Sat, 29 May 2010 10:40:06 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Vielen Dank, camper, das beantwortet schon mal einiges. <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="🙂"
    /></p>
<p>camper schrieb:</p>
<blockquote>
<p>Jedenfalls müsstest du, um das gewünschte Verhalten mit Sicherheit zu erreichen, foo&lt;int&gt;::v zuvor explizit instantiieren.</p>
</blockquote>
<p>Doofe Frage: wie mache ich das?</p>
</blockquote>
<pre><code class="language-cpp">template vector&lt;foo&lt;int&gt;*&gt; foo&lt;int&gt;::v;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1904047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904047</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 29 May 2010 10:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Sat, 29 May 2010 12:10:06 GMT]]></title><description><![CDATA[<p>Eine Alternative wäre auch eine funktionslokale statische Variable, denn diese wird beim ersten Aufruf der Funktion initialisiert. Wenn die Funktion gar nie aufgerufen wird, fällt die Konstruktion von <code>v</code> weg.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class foo
{
public:
    foo()
    {
        GetV().push_back(this);
    }

private:
    static vector&lt;foo&lt;T&gt;*&gt;&amp; GetV()
    {
        static vector&lt;foo&lt;T&gt;*&gt; v;
        return v;
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1904073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904073</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 29 May 2010 12:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;Unbekannter Softwarefehler&amp;quot; bei globaler Variable einer Templateklasse mit statischem Member on Sun, 30 May 2010 10:51:00 GMT]]></title><description><![CDATA[<p>Vielen Dank euch beiden.<br />
Die Variante mit der expliziten Instantiierung liefert bei mir leider den gleichen Fehler, aber Nexus' Idee gefällt mir sehr gut. Damit entfällt auch diese umständliche Syntax bei der Definition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1904410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1904410</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sun, 30 May 2010 10:51:00 GMT</pubDate></item></channel></rss>