<?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[Static Order Problem?]]></title><description><![CDATA[<p>Hallo, meine Anwendung stürzt in der &quot;dbgdel.cpp&quot;-Datei an Stelle</p>
<pre><code>_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse));
</code></pre>
<p>ab. Auf der Suche nach der Ursache habe ich die ganze Anwendung auf den beteiligten Code runtergebrochen. Verstehen tue ich es aber immer noch nicht.<br />
Das Minimal-Konsolenprogramm könnt ihr hier runterladen:<br />
<a href="https://rapidshare.com/files/460894194/Programm.rar" rel="nofollow">https://rapidshare.com/files/460894194/Programm.rar</a><br />
Genau genommen stürzt das Programm sogar zweimal ab. Das erste mal beim Aufruf der</p>
<pre><code>Member::MemberImpl::MemberImpl(const Info&amp; ownerInfo)
</code></pre>
<p>Funktion in der Member.cpp in der Zeile</p>
<pre><code>Info info(ownerInfo);
</code></pre>
<p>. Das zweite mal beim Beenden der Anwendung.<br />
Woran kann das liegen? Static Order Fiasco? Oder doch ein Zeiger, Referenz die ins Nirvana zeigt?<br />
Zum Programmablauf:<br />
Die Klassen &quot;Basic&quot; und &quot;Derived&quot; haben jeweils eine statische Funktion &quot;StaticInfo&quot;,</p>
<pre><code>Info&amp; Derived::StaticInfo()
{
	static Info info(Base::StaticInfo());
	return info;
}
</code></pre>
<p>die eine Referenz auf ein &quot;Info&quot;-Object zurückgeben. Zusätzlich verweist ein Pointer des Info-Objects der Derived-Klasse auf das Info-Object der Base-Klasse.<br />
Weiter hat die Derived-Klasse mehrere statische Member, die über die statische Funktion</p>
<pre><code>Member::Init(StaticInfo())
</code></pre>
<p>initialisiert werden. Als Paramter wird dieser Funktion das Info-Object übergeben, das von der statischen Funktion StaticInfo() zurückgegeben wird.<br />
In der Init-Funktion selber wird ein Member-Object erzeugt und zurückgegeben und einer statischen Liste hinzugefügt.</p>
<pre><code>std::vector&lt;Member*&gt;&amp; Member::List()
{
	static std::vector&lt;Member*&gt; list;
	return list;
}
</code></pre>
<p>Wenn es also wirklich ein Static Order Problem ist, dann müsste es doch bei der Initialisierung eines der statischen Member auftreten, da diese nicht wie die anderen statischen Objecte in Statische-Funktionen &quot;eingelassen&quot; sind. Allerdings rufen diese Member sich ja gar nicht gegenseitig auf. Bei der Initialisierung wird nur auf die statischen-Funktionen StaticInfo() und List() zugegriffen, die ja ihre Objekte beim ersten Aufruf erzeugen sollten. Darum glaube ich nicht, dass hier ein static order Problem vorliegt. Aber was verursacht den Absturz dann?<br />
Achso, dass ich zwei mal das Pimpl-Idom verwenden muss lässt sich leider aus Designgründen nicht vermeiden. Sollte aber nicht das Problem sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286245/static-order-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 00:03:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286245.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 May 2011 11:48:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 11:48:53 GMT]]></title><description><![CDATA[<p>Hallo, meine Anwendung stürzt in der &quot;dbgdel.cpp&quot;-Datei an Stelle</p>
<pre><code>_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse));
</code></pre>
<p>ab. Auf der Suche nach der Ursache habe ich die ganze Anwendung auf den beteiligten Code runtergebrochen. Verstehen tue ich es aber immer noch nicht.<br />
Das Minimal-Konsolenprogramm könnt ihr hier runterladen:<br />
<a href="https://rapidshare.com/files/460894194/Programm.rar" rel="nofollow">https://rapidshare.com/files/460894194/Programm.rar</a><br />
Genau genommen stürzt das Programm sogar zweimal ab. Das erste mal beim Aufruf der</p>
<pre><code>Member::MemberImpl::MemberImpl(const Info&amp; ownerInfo)
</code></pre>
<p>Funktion in der Member.cpp in der Zeile</p>
<pre><code>Info info(ownerInfo);
</code></pre>
<p>. Das zweite mal beim Beenden der Anwendung.<br />
Woran kann das liegen? Static Order Fiasco? Oder doch ein Zeiger, Referenz die ins Nirvana zeigt?<br />
Zum Programmablauf:<br />
Die Klassen &quot;Basic&quot; und &quot;Derived&quot; haben jeweils eine statische Funktion &quot;StaticInfo&quot;,</p>
<pre><code>Info&amp; Derived::StaticInfo()
{
	static Info info(Base::StaticInfo());
	return info;
}
</code></pre>
<p>die eine Referenz auf ein &quot;Info&quot;-Object zurückgeben. Zusätzlich verweist ein Pointer des Info-Objects der Derived-Klasse auf das Info-Object der Base-Klasse.<br />
Weiter hat die Derived-Klasse mehrere statische Member, die über die statische Funktion</p>
<pre><code>Member::Init(StaticInfo())
</code></pre>
<p>initialisiert werden. Als Paramter wird dieser Funktion das Info-Object übergeben, das von der statischen Funktion StaticInfo() zurückgegeben wird.<br />
In der Init-Funktion selber wird ein Member-Object erzeugt und zurückgegeben und einer statischen Liste hinzugefügt.</p>
<pre><code>std::vector&lt;Member*&gt;&amp; Member::List()
{
	static std::vector&lt;Member*&gt; list;
	return list;
}
</code></pre>
<p>Wenn es also wirklich ein Static Order Problem ist, dann müsste es doch bei der Initialisierung eines der statischen Member auftreten, da diese nicht wie die anderen statischen Objecte in Statische-Funktionen &quot;eingelassen&quot; sind. Allerdings rufen diese Member sich ja gar nicht gegenseitig auf. Bei der Initialisierung wird nur auf die statischen-Funktionen StaticInfo() und List() zugegriffen, die ja ihre Objekte beim ersten Aufruf erzeugen sollten. Darum glaube ich nicht, dass hier ein static order Problem vorliegt. Aber was verursacht den Absturz dann?<br />
Achso, dass ich zwei mal das Pimpl-Idom verwenden muss lässt sich leider aus Designgründen nicht vermeiden. Sollte aber nicht das Problem sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059465</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 11:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 16:56:12 GMT]]></title><description><![CDATA[<p>SOP schrieb:</p>
<blockquote>
<p>Auf der Suche nach der Ursache habe ich die ganze Anwendung auf den beteiligten Code runtergebrochen. Verstehen tue ich es aber immer noch nicht.<br />
Das Minimal-Konsolenprogramm könnt ihr hier runterladen:</p>
</blockquote>
<p>Löblich. aber wenn der Code wirklich so weit runtergebrochen wurde, kannst du ihn auch gerne komplett hier posten. Die wenigsten werden zeit/Lust haben, sich das runterzuladen. Vom rapidshare-Account mal ganz zu schweigen. Wen du Hilfe möchtest machs uns nicht so schwer dir zu helfen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2059640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059640</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 06 May 2011 16:56:12 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:43:54 GMT]]></title><description><![CDATA[<p>Das sind halt schon ein paar Dateien und einen Rapidshare-Account braucht man auch nicht. Habe ja selber keinen. Aber gut dann poste ich den Code mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059780</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:46:29 GMT]]></title><description><![CDATA[<p>Base.h</p>
<pre><code>#ifndef BASE_H
#define BASE_H

#include &quot;Info.h&quot;

class Base
{
public:
	Base();
	static Info&amp; StaticInfo();
};

#endif
</code></pre>
<p>Base.cpp</p>
<pre><code>#include &quot;Base.h&quot;

Base::Base()
{
}

Info&amp; Base::StaticInfo()
{
	static Info info;
	return info;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059782</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:47:46 GMT]]></title><description><![CDATA[<p>Info.h</p>
<pre><code>#ifndef INFO_H
#define INFO_H

class Info
{
public:
	Info();
	Info(Info* baseInfo);
	~Info();

private:
	class InfoImpl;
	InfoImpl* impl;
};

#endif
</code></pre>
<p>Info.cpp</p>
<pre><code>#include &quot;Info.h&quot;

class Info::InfoImpl
{
public:
	InfoImpl();
	InfoImpl(Info* baseInfo);

	Info* baseInfo;
};

Info::InfoImpl::InfoImpl() :
	baseInfo(nullptr)
{
}

Info::InfoImpl::InfoImpl(Info* baseInfo) :
	baseInfo(baseInfo)
{
}

Info::Info() :
	impl(new Info::InfoImpl())
{
}

Info::Info(Info* baseInfo) :
	impl(new Info::InfoImpl(baseInfo))
{
}

Info::~Info()
{
	delete impl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059783</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:47:46 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:49:04 GMT]]></title><description><![CDATA[<p>Member.h</p>
<pre><code>#ifndef MEMBER_H
#define MEMBER_H

#include &lt;vector&gt;

class Info;

class Member
{
public:
	Member();
	Member(const Info&amp; ownerInfo);
	~Member();

	static Member&amp; Init(const Info&amp; ownerInfo);
	static std::vector&lt;Member*&gt;&amp; List();

private:
	class MemberImpl;
	MemberImpl* impl;
};

#endif
</code></pre>
<p>Member.cpp</p>
<pre><code>#include &quot;Member.h&quot;
#include &quot;Info.h&quot;

class Member::MemberImpl
{
public:
	MemberImpl();
	MemberImpl(const Info&amp; ownerType);
	~MemberImpl();

	Info ownerInfo;
};

Member::MemberImpl::MemberImpl()
{
}

Member::MemberImpl::MemberImpl(const Info&amp; ownerInfo) :
	ownerInfo(ownerInfo)
{
	//Hier stürzt das Programm ab
	Info info(ownerInfo);
}

Member::MemberImpl::~MemberImpl()
{
}

Member::Member() :
	impl(new Member::MemberImpl())
{
}

Member::Member(const Info&amp; ownerInfo) :
	impl(new Member::MemberImpl(ownerInfo))
{
}

Member::~Member()
{
	delete impl;
}

Member&amp; Member::Init(const Info&amp; ownerInfo)
{
	Member* member = new Member(ownerInfo);
	List().push_back(member);
	return *member;
}

std::vector&lt;Member*&gt;&amp; Member::List()
{
	static std::vector&lt;Member*&gt; list;
	return list;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059786</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:50:08 GMT]]></title><description><![CDATA[<p>Derived.h</p>
<pre><code>#ifndef DERIVED_H
#define DERIVED_H

#include &quot;Member.h&quot;
#include &quot;Base.h&quot;

class Derived : public Base
{
public:
	Derived();
	static Info&amp; StaticInfo();

protected:
	static Member m1;
	static Member m2;
	static Member m3;
	static Member m4;
};

#endif
</code></pre>
<p>Derived.cpp</p>
<pre><code>#include &quot;Derived.h&quot;

Member Derived::m1 = Member::Init(StaticInfo());
Member Derived::m2 = Member::Init(StaticInfo());
Member Derived::m3 = Member::Init(StaticInfo());
Member Derived::m4 = Member::Init(StaticInfo());

Derived::Derived()
{
}

Info&amp; Derived::StaticInfo()
{
	static Info info(Base::StaticInfo());
	return info;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059787</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:51:00 GMT]]></title><description><![CDATA[<p>Main.cpp</p>
<pre><code>#include &lt;Windows.h&gt;
#include &lt;iostream&gt;
#include &quot;Derived.h&quot;

int main()
{
	Derived d;
	std::wcout &lt;&lt; L&quot;Hello World!&quot; &lt;&lt; std::endl;
	while(true){};
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2059788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059788</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 20:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 20:52:14 GMT]]></title><description><![CDATA[<p>Zu einer .c gehört eine .h und zu einer .cpp gehört eine .hpp!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059789</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 06 May 2011 20:52:14 GMT</pubDate></item><item><title><![CDATA[Reply to Static Order Problem? on Fri, 06 May 2011 22:00:39 GMT]]></title><description><![CDATA[<p>Ok, das lässt sich ändern. Aber zurück zum eigentlichen Problem:</p>
<pre><code>Member::MemberImpl::MemberImpl(const Info&amp; ownerInfo) :
    ownerInfo(ownerInfo)
{
    //Hier stürzt das Programm ab
    Info info(ownerInfo);
}
</code></pre>
<p>Warum nur?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059822</guid><dc:creator><![CDATA[SOP]]></dc:creator><pubDate>Fri, 06 May 2011 22:00:39 GMT</pubDate></item></channel></rss>