<?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[Absturz bei Klassentemplates]]></title><description><![CDATA[<p>Hey,</p>
<p>ich habe folgendes Problem: Ich habe ein Klassentemplate, welches einen Graphen darstellen soll. Wenn ich in dem Template allerdings zu große Werte übergebe, stürzt das Programm aufgrund eines Stack-Overflows ab!</p>
<pre><code class="language-cpp">#pragma once
#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

template &lt;class TV, int maxNodes&gt;
class Digraph {

private:
    class Vertex
    {
        public:
			Vertex() {     // Konstruktor
				indegree = outdegree = ord = 0;
				visited = false;
				living = false;
				value = 0;
            }

            TV value;       // Markierung
            int indegree;  // Eingangsgrad
            int outdegree; // Ausgangsgrad
            int ord;       // Ordnungszahl des Knotens
            bool visited;  // Knoten-&quot;besucht&quot;-Marke
            bool living;   // Knoten existiert
    };
	double noArc; 
    int numvertices;                // Anzahl der Knoten eines Digraphen
    int numarcs;                    // Anzahl der Kanten eines Digraphen
    Vertex vertex[maxNodes];        // repräsentiert Knoten des Digraphen
    double arc[maxNodes][maxNodes]; // repräsentiert bewertete Kanten des Digraphen (-1=keine Kante) ARC = EDGE 

public:

	Digraph(){		// Digraphen generieren
		noArc = -1;
		for (int i=0;i&lt;maxNodes;i++)        //Adajenz-Matrix füllen
            for (int j=0;j&lt;maxNodes;j++)
                arc[i][j]=noArc;

	}
</code></pre>
<p>und hier halt noch meine Test-Main, wo ich das Objekt erstelle:</p>
<pre><code class="language-cpp">int main(){
	Digraph&lt;int, 500&gt; graphy; 
	return 0;
}
</code></pre>
<p>Fehler:</p>
<blockquote>
<p>Eine Ausnahme (erste Chance) bei 0x00411947 in Aufgabe 12.exe: 0xC00000FD: Stack overflow.<br />
Unbehandelte Ausnahme bei 0x00411947 in Aufgabe 12.exe: 0xC00000FD: Stack overflow.</p>
</blockquote>
<p>Mich wundert es, dass es hier schon zu einem StackOverflow kommt. Ich denke mal, dass es an dem double <strong>arc[maxNodes][maxNodes]</strong> liegt. Aber bei 500*500 Integer Werten komme ich bei 4 Byte pro Int auf 1Mb. Scheitert es echt daran??</p>
<p>Das ganze ist eigentlich nicht sehr schlimm. Ich brauche nicht mehr als 50, damit stürzt das Programm nicht ab! Aber wenn ich dann damit weiterprogrammiere bekomme ich beim ifstream und ofstream immer folgenden Fehler, obwohl ich keine dll's benutze.</p>
<blockquote>
<p>Windows hat einen Haltepunkt in Navi.exe ausgelöst.</p>
<p>Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in Navi.exe oder in einer der geladenen DLLs hin.</p>
</blockquote>
<p>Davor habe ich eine Liste benutzt und da ging die gleiche Methode (mit of und ifstream). Hier mal ein kleiner Auszug, die bindatei wurde vorher mit einem String initialisiert (als Klassenmethode). Der Teil mit Kommentar zeigt an wo der Debugger rausspringt.</p>
<pre><code class="language-cpp">void Navigationssystem::bin_lesen(){

	char tmp[100] = {0};

	ifstream quelle; // CRASH
	quelle.open(bindatei.c_str(), ios::binary|ios::in);
...
</code></pre>
<p>Da aber die Methode vorher einwandfrei funktioniert hat, denke ich liegt es an dem oben genannten Problem! Oder es kann es vielleicht daran liegen, dass ich eine selbstgeschriebene Klasse in der Template benutze? (Digraph&lt;Ort, 10&gt; graphy;)</p>
<p>Ich benutze Visual C++ 2005 und benutze einen relativ neuen Laptop mit &gt;2Gb Ram</p>
<p>Falls ihr noch mehr Code braucht, sagt bescheid.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244150/absturz-bei-klassentemplates</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 12:18:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244150.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Jun 2009 21:16:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Thu, 25 Jun 2009 21:16:08 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich habe folgendes Problem: Ich habe ein Klassentemplate, welches einen Graphen darstellen soll. Wenn ich in dem Template allerdings zu große Werte übergebe, stürzt das Programm aufgrund eines Stack-Overflows ab!</p>
<pre><code class="language-cpp">#pragma once
#include &lt;iostream&gt;
#include &lt;string&gt;
using namespace std;

template &lt;class TV, int maxNodes&gt;
class Digraph {

private:
    class Vertex
    {
        public:
			Vertex() {     // Konstruktor
				indegree = outdegree = ord = 0;
				visited = false;
				living = false;
				value = 0;
            }

            TV value;       // Markierung
            int indegree;  // Eingangsgrad
            int outdegree; // Ausgangsgrad
            int ord;       // Ordnungszahl des Knotens
            bool visited;  // Knoten-&quot;besucht&quot;-Marke
            bool living;   // Knoten existiert
    };
	double noArc; 
    int numvertices;                // Anzahl der Knoten eines Digraphen
    int numarcs;                    // Anzahl der Kanten eines Digraphen
    Vertex vertex[maxNodes];        // repräsentiert Knoten des Digraphen
    double arc[maxNodes][maxNodes]; // repräsentiert bewertete Kanten des Digraphen (-1=keine Kante) ARC = EDGE 

public:

	Digraph(){		// Digraphen generieren
		noArc = -1;
		for (int i=0;i&lt;maxNodes;i++)        //Adajenz-Matrix füllen
            for (int j=0;j&lt;maxNodes;j++)
                arc[i][j]=noArc;

	}
</code></pre>
<p>und hier halt noch meine Test-Main, wo ich das Objekt erstelle:</p>
<pre><code class="language-cpp">int main(){
	Digraph&lt;int, 500&gt; graphy; 
	return 0;
}
</code></pre>
<p>Fehler:</p>
<blockquote>
<p>Eine Ausnahme (erste Chance) bei 0x00411947 in Aufgabe 12.exe: 0xC00000FD: Stack overflow.<br />
Unbehandelte Ausnahme bei 0x00411947 in Aufgabe 12.exe: 0xC00000FD: Stack overflow.</p>
</blockquote>
<p>Mich wundert es, dass es hier schon zu einem StackOverflow kommt. Ich denke mal, dass es an dem double <strong>arc[maxNodes][maxNodes]</strong> liegt. Aber bei 500*500 Integer Werten komme ich bei 4 Byte pro Int auf 1Mb. Scheitert es echt daran??</p>
<p>Das ganze ist eigentlich nicht sehr schlimm. Ich brauche nicht mehr als 50, damit stürzt das Programm nicht ab! Aber wenn ich dann damit weiterprogrammiere bekomme ich beim ifstream und ofstream immer folgenden Fehler, obwohl ich keine dll's benutze.</p>
<blockquote>
<p>Windows hat einen Haltepunkt in Navi.exe ausgelöst.</p>
<p>Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in Navi.exe oder in einer der geladenen DLLs hin.</p>
</blockquote>
<p>Davor habe ich eine Liste benutzt und da ging die gleiche Methode (mit of und ifstream). Hier mal ein kleiner Auszug, die bindatei wurde vorher mit einem String initialisiert (als Klassenmethode). Der Teil mit Kommentar zeigt an wo der Debugger rausspringt.</p>
<pre><code class="language-cpp">void Navigationssystem::bin_lesen(){

	char tmp[100] = {0};

	ifstream quelle; // CRASH
	quelle.open(bindatei.c_str(), ios::binary|ios::in);
...
</code></pre>
<p>Da aber die Methode vorher einwandfrei funktioniert hat, denke ich liegt es an dem oben genannten Problem! Oder es kann es vielleicht daran liegen, dass ich eine selbstgeschriebene Klasse in der Template benutze? (Digraph&lt;Ort, 10&gt; graphy;)</p>
<p>Ich benutze Visual C++ 2005 und benutze einen relativ neuen Laptop mit &gt;2Gb Ram</p>
<p>Falls ihr noch mehr Code braucht, sagt bescheid.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732962</guid><dc:creator><![CDATA[Weedjo]]></dc:creator><pubDate>Thu, 25 Jun 2009 21:16:08 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Thu, 25 Jun 2009 22:08:39 GMT]]></title><description><![CDATA[<p>ok dann wollen wir mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>unter windows ist der stack normalerweise ca. 1MB groß. -&gt; batsch deshalb stürtzt<br />
er ab. verusch entweder ein ynamisches array oder nimm std::vector:</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;double&gt; &gt; arc;

// im ctor

classname() : noArc(-1), arc(max, std::vector&lt;double&gt;(max, noArc))
</code></pre>
<p>wobei ich mir bei letzerem nicht sicher bin in welcher reihenfolge das initialisisert wird</p>
<p>du kannst ruhig klassen in templates definieren, gar kein problem und durchaus üblich</p>
<p>teste mal ons damit immernoch abstürtzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1732986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1732986</guid><dc:creator><![CDATA[tippgeber]]></dc:creator><pubDate>Thu, 25 Jun 2009 22:08:39 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Fri, 26 Jun 2009 00:16:20 GMT]]></title><description><![CDATA[<p>tippgeber schrieb:</p>
<blockquote>
<p>wobei ich mir bei letzerem nicht sicher bin in welcher reihenfolge das initialisisert wird</p>
</blockquote>
<p>von links nach rechts bzw oben nach unten, wenn man auf je eine zeile schreibt...</p>
<pre><code class="language-cpp">foo::foo()
: a(0),
  b(a)
{}
</code></pre>
<p>das ist also iO</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733027</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 26 Jun 2009 00:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Fri, 26 Jun 2009 17:34:38 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>tippgeber schrieb:</p>
<blockquote>
<p>wobei ich mir bei letzerem nicht sicher bin in welcher reihenfolge das initialisisert wird</p>
</blockquote>
<p>von links nach rechts bzw oben nach unten, wenn man auf je eine zeile schreibt...</p>
<pre><code class="language-cpp">foo::foo()
: a(0),
  b(a)
{}
</code></pre>
<p>das ist also iO</p>
<p>bb</p>
</blockquote>
<p>Nope. Es spielt keine Rolle, in welcher Reihenfolge das in der Initialisierungsliste steht, sondern in der Deklaration in der Klasse. (das sieht man oft ganz fiese Fehler erzeugen. ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733428</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 26 Jun 2009 17:34:38 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Fri, 26 Jun 2009 20:56:06 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>tippgeber schrieb:</p>
<blockquote>
<p>wobei ich mir bei letzerem nicht sicher bin in welcher reihenfolge das initialisisert wird</p>
</blockquote>
<p>von links nach rechts bzw oben nach unten, wenn man auf je eine zeile schreibt...</p>
<pre><code class="language-cpp">foo::foo()
: a(0),
  b(a)
{}
</code></pre>
<p>das ist also iO</p>
<p>bb</p>
</blockquote>
<p>Nope. Es spielt keine Rolle, in welcher Reihenfolge das in der Initialisierungsliste steht, sondern in der Deklaration in der Klasse. (das sieht man oft ganz fiese Fehler erzeugen. ;))</p>
</blockquote>
<p>OO<br />
Sicher? Was sollte das für nen Grund haben?<br />
Hab auch gerad nix im Standard dazu gefunden -.-</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733520</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 26 Jun 2009 20:56:06 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Fri, 26 Jun 2009 22:20:42 GMT]]></title><description><![CDATA[<p>ISO/IEC 14882 12.6.2/5 schrieb:</p>
<blockquote>
<p>5 Initialization shall proceed in the following order:<br />
[...]<br />
— Then, nonstatic data members shall be initialized in the order they were declared in the class definition<br />
(again regardless of the order of the mem-initializers).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1733551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733551</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Fri, 26 Jun 2009 22:54:00 GMT]]></title><description><![CDATA[<p>danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733554</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 26 Jun 2009 22:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 05:22:08 GMT]]></title><description><![CDATA[<p>Hat das nenn Sinn, dass die das so unlogisch gemacht haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733570</guid><dc:creator><![CDATA[oho]]></dc:creator><pubDate>Sat, 27 Jun 2009 05:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 09:05:02 GMT]]></title><description><![CDATA[<p>oho schrieb:</p>
<blockquote>
<p>Hat das nenn Sinn, dass die das so unlogisch gemacht haben?</p>
</blockquote>
<p>Das hat einen Sinn, und das ist alles andere als unlogisch. Gesetzt den Fall, die Reihenfolge in der Initialisierungsliste wäre entscheidend. Dann könnte man zwei Konstruktoren haben mit verschiedener Initialisierungsreihenfolge. Beim Zerstören eines Objektes sollte aber die Reihenfolge der Zerstörung der Member umgekehrt zur Initialisierung sein. Je nachdem welcher Konstruktor aufgerufen wurde, müsste also im Destruktor ein anderer Ablauf erfolgen. Dazu müsste wiederum für jedes einzelne Objekt mitgeloggt werden, in welcher Reihenfolge die einzelnen Member initialisiert wurden. Das würde einen nicht akzeptablen Overhead erzeugen.<br />
Bei der Initialisierung in der Reihenfolge der Memberdeklaration kommt dagegen noch ein anderer Vorteil hinzu: Meistens werden die einzelnen Member in der Reihenfolge der Deklaration im Speicher abgelegt. Beim Initialisieren in derselben Reihenfolge kann dann der zum Objekt gehörige Speicher &quot;von vorne nach hinten&quot; initialisiert werden, ohne dass wild darin hin- und hergehüpft werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733584</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 27 Jun 2009 09:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 11:36:46 GMT]]></title><description><![CDATA[<p>noch n punkt, warum es gut ist dass man mit dem neuen standard etwas von diesen initialisierungslisten weg kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733623</guid><dc:creator><![CDATA[1punkt]]></dc:creator><pubDate>Sat, 27 Jun 2009 11:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 12:15:05 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Beim Zerstören eines Objektes sollte aber die Reihenfolge der Zerstörung der Member umgekehrt zur Initialisierung sein.</p>
</blockquote>
<p>Wieso muss das der Fall sein?</p>
<p>@1punkt:<br />
aber wenn die Initialisierung der einzelnen Member voneinander abhängig ist, siehts auch schon nich mehr so gut aus mit der neuen Art der Initialisierung - und man ist wieder(immernoch) auf die Init-Liste angewiesen... Abhängig nacheinander klingt nämlich auch immer nach abhängig von Parametern...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733646</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 27 Jun 2009 12:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 14:04:29 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Beim Zerstören eines Objektes sollte aber die Reihenfolge der Zerstörung der Member umgekehrt zur Initialisierung sein.</p>
</blockquote>
<p>Wieso muss das der Fall sein?</p>
</blockquote>
<p>Ich denke mal, dass dir ein wenig Code mehr sagt, als ein langer Text. <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>
<pre><code class="language-cpp">class B
{
public:
	int i;

	B ()
		:
	i ( 2 )
	{}

	~B ()
	{
		i = 0;
	}

};

class A
{
	B&amp; b_;
public:
	A ( B&amp; b )
		:
	b_ ( b )
	{
		std::cout &lt;&lt; b_.i &lt;&lt; std::endl;
	}

	~A ()
	{
		std::cout &lt;&lt; b_.i &lt;&lt; std::endl;
	}
};

class foo 
{
	B b;
	A a;

public:
	foo ()
		:
	a ( b )
	{
	}

	~foo ()
	{
	}
};

int main ()
{
	foo f;
}
</code></pre>
<p>Was wäre hier, wenn a und b in foo nicht in umgekehrter Reihenfolge zerstört werden würde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733712</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 27 Jun 2009 14:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 15:04:50 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>@1punkt:<br />
aber wenn die Initialisierung der einzelnen Member voneinander abhängig ist, siehts auch schon nich mehr so gut aus mit der neuen Art der Initialisierung - und man ist wieder(immernoch) auf die Init-Liste angewiesen... Abhängig nacheinander klingt nämlich auch immer nach abhängig von Parametern...</p>
</blockquote>
<p>Versteh nicht was du meinst. Die InitListe bringt doch nichts bei Abhängigkeiten, da sowieso nach Deklarationsreihen folge init. wird. Oder hab ich drakon falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733732</guid><dc:creator><![CDATA[1punkt]]></dc:creator><pubDate>Sat, 27 Jun 2009 15:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz bei Klassentemplates on Sat, 27 Jun 2009 15:20:24 GMT]]></title><description><![CDATA[<p>Ich denke er meinte, das, wenn man das machen will, was ich im obigen Beispiel gemacht habe und man zuerst a ( b ) und dann b () macht. Dann sieht das verwirrend aus und kann eine falsche Annahme verursachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1733738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1733738</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 27 Jun 2009 15:20:24 GMT</pubDate></item></channel></rss>