<?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[segmentation fault bei Dereferenzierung eines Pointers]]></title><description><![CDATA[<p>Hallo c++ Forum, ich habe hier einen sehr seltsamen Fehler bei der dereferenzierung eines Pointers und zwar geht es um die Darstellung eines Graphen. Dazu habe ich folgende Datenstruktur</p>
<p>Die Klasse Graph benutzt einen vector&lt;vertex&gt; um Instanzen der Vertex Klasse zu speichern. Jeder vertex hat fuer sich wieder einen vector&lt;vertex*&gt;, der Pointer auf seine Nachbarknoten speichern soll. So genug geredet, Code sagt sicher mehr als tausend Worte.</p>
<pre><code class="language-cpp">graph&amp; graph::getInstance()
{
	static graph instance;
	return instance;
}

graph::graph()
{
	vertexList = new vector&lt;vertex&gt;;
	if (vertexList == NULL)
	{
		cerr &lt;&lt; &quot;Error, could not allocate enough memory&quot; &lt;&lt; endl;
	}
}

void graph::addVertex(string name)
{
	if(findVertexByName(name) == NULL)
	{
		vertex tempVertex(name);
		vertexList-&gt;push_back(tempVertex);
	}
}

//adds a pointer to vertex2 in vertex1s neighbourlist
//this would be directed edge, but our parser will call this function twice for each edge 
void graph::addEdge(string vertex1, string vertex2)
{
	//cout &lt;&lt; &quot;trying to add an edge from &quot; &lt;&lt; vertex1 &lt;&lt; &quot; to &quot; &lt;&lt; vertex2 &lt;&lt; endl;
	vertex* vertexPtr1 = findVertexByName(vertex1);
	vertex* vertexPtr2 = findVertexByName(vertex2);
	std::printf(&quot;%s: %p, %s: %p\n&quot;,vertex1.c_str(), vertexPtr1, vertex2.c_str(), vertexPtr2);
	cout &lt;&lt; vertexPtr1-&gt;getName() &lt;&lt; &quot; to &quot; &lt;&lt; vertexPtr2-&gt;getName() &lt;&lt; endl; // hier kann ich die Pointer noch dereferenzieren
	if (vertexPtr1 != NULL &amp;&amp; vertexPtr2 != NULL)
		vertexPtr1-&gt;addNeighbour(vertexPtr2);
}

vector&lt;vertex&gt;* graph::getVertexList()
{
	return vertexList;

}

void graph::print()
{
	cout &lt;&lt; vertexList-&gt;size() &lt;&lt; endl;
	for (vector &lt;vertex&gt;::iterator it = vertexList-&gt;begin(); it != vertexList-&gt;end(); ++it) 
	{
		cout &lt;&lt; it-&gt;toString() &lt;&lt;endl;
	}
}

vertex* graph::findVertexByName(string name)
{
	for (vector &lt;vertex&gt;::iterator it = vertexList-&gt;begin(); it != vertexList-&gt;end(); ++it) 
	{
		if(name.compare((*it).getName())==0)
		{
			return &amp;(*it);
		}
	}
	return NULL;
}
</code></pre>
<p>Und der Implementationsteil der Vertex Klasse:</p>
<pre><code class="language-cpp">vertex::vertex(string vertexname)
{
	id = vertex::count;
	vertex::count++;
	name = vertexname;
}

void vertex::addNeighbour(vertex* neigh)
{
	neighbours.push_back(neigh);
}

string vertex::toString()
{
	string str=getName();
	cout &lt;&lt; &quot;Printing vertex: &quot; &lt;&lt; str &lt;&lt; endl;
	str.append(&quot; at (&quot;);
	str.append(doubleToString(coords.x()));
	str.append(&quot;|&quot;);
	str.append(doubleToString(coords.y()));
	str.append(&quot;), has &quot;);

	stringstream tmp;
	tmp &lt;&lt; neighbours.size();
	str.append(tmp.str());

	str.append(&quot; neighbours: |&quot;);

	for (vector &lt;vertex*&gt;::iterator it = neighbours.begin(); it != neighbours.end(); ++it) 
	{
		cout &lt;&lt; &quot;Found neighbour &quot;&lt;&lt; (*it)-&gt;getName() &lt;&lt; endl; // diese dereferenzierung geht schief
		str.append((*it)-&gt;getName()); /
		str.append(&quot;|&quot;);
	}

	return str;
}

string vertex::getName()
{
	return name;
}
</code></pre>
<p>Der eingelesene Graph sieht folgendermassen aus und wird von bison und flex geparst (der von bison generierte parser ruft die Funktionen addVertex() und addEdge() auf)</p>
<p>graph graphname {<br />
a -- b -- c;<br />
}</p>
<p>Ausgabe:<br />
c: 0x9f162b0, b: 0x9f16288<br />
c to b<br />
b: 0x9f16288, c: 0x9f162b0<br />
b to c<br />
b: 0x9f16330, a: 0x9f16380<br />
b to a<br />
a: 0x9f16380, b: 0x9f16330<br />
a to b<br />
Anzahl der Knoten: 3<br />
Printing vertex: b<br />
zsh: segmentation fault (core dumped)</p>
<p>So, ich hoffe ich habe alles gepasted was zur Loesung beitragen kann.<br />
Das seltsame an diesem Problem ist, dass ich die Pointer eben beim hinzufuegen zum neighbours vector dereferenzieren kann und per getName() den namen auslesen kann, wenn ich aber die liste durchgehe, klappt das nicht mehr, sobald mehr als 3 Knoten im Spiel sind.</p>
<p>Danke schonmal fuer das lesen des vielen Textes.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267012/segmentation-fault-bei-dereferenzierung-eines-pointers</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 15:48:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267012.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 May 2010 01:27:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 01:49:59 GMT]]></title><description><![CDATA[<p>Hallo c++ Forum, ich habe hier einen sehr seltsamen Fehler bei der dereferenzierung eines Pointers und zwar geht es um die Darstellung eines Graphen. Dazu habe ich folgende Datenstruktur</p>
<p>Die Klasse Graph benutzt einen vector&lt;vertex&gt; um Instanzen der Vertex Klasse zu speichern. Jeder vertex hat fuer sich wieder einen vector&lt;vertex*&gt;, der Pointer auf seine Nachbarknoten speichern soll. So genug geredet, Code sagt sicher mehr als tausend Worte.</p>
<pre><code class="language-cpp">graph&amp; graph::getInstance()
{
	static graph instance;
	return instance;
}

graph::graph()
{
	vertexList = new vector&lt;vertex&gt;;
	if (vertexList == NULL)
	{
		cerr &lt;&lt; &quot;Error, could not allocate enough memory&quot; &lt;&lt; endl;
	}
}

void graph::addVertex(string name)
{
	if(findVertexByName(name) == NULL)
	{
		vertex tempVertex(name);
		vertexList-&gt;push_back(tempVertex);
	}
}

//adds a pointer to vertex2 in vertex1s neighbourlist
//this would be directed edge, but our parser will call this function twice for each edge 
void graph::addEdge(string vertex1, string vertex2)
{
	//cout &lt;&lt; &quot;trying to add an edge from &quot; &lt;&lt; vertex1 &lt;&lt; &quot; to &quot; &lt;&lt; vertex2 &lt;&lt; endl;
	vertex* vertexPtr1 = findVertexByName(vertex1);
	vertex* vertexPtr2 = findVertexByName(vertex2);
	std::printf(&quot;%s: %p, %s: %p\n&quot;,vertex1.c_str(), vertexPtr1, vertex2.c_str(), vertexPtr2);
	cout &lt;&lt; vertexPtr1-&gt;getName() &lt;&lt; &quot; to &quot; &lt;&lt; vertexPtr2-&gt;getName() &lt;&lt; endl; // hier kann ich die Pointer noch dereferenzieren
	if (vertexPtr1 != NULL &amp;&amp; vertexPtr2 != NULL)
		vertexPtr1-&gt;addNeighbour(vertexPtr2);
}

vector&lt;vertex&gt;* graph::getVertexList()
{
	return vertexList;

}

void graph::print()
{
	cout &lt;&lt; vertexList-&gt;size() &lt;&lt; endl;
	for (vector &lt;vertex&gt;::iterator it = vertexList-&gt;begin(); it != vertexList-&gt;end(); ++it) 
	{
		cout &lt;&lt; it-&gt;toString() &lt;&lt;endl;
	}
}

vertex* graph::findVertexByName(string name)
{
	for (vector &lt;vertex&gt;::iterator it = vertexList-&gt;begin(); it != vertexList-&gt;end(); ++it) 
	{
		if(name.compare((*it).getName())==0)
		{
			return &amp;(*it);
		}
	}
	return NULL;
}
</code></pre>
<p>Und der Implementationsteil der Vertex Klasse:</p>
<pre><code class="language-cpp">vertex::vertex(string vertexname)
{
	id = vertex::count;
	vertex::count++;
	name = vertexname;
}

void vertex::addNeighbour(vertex* neigh)
{
	neighbours.push_back(neigh);
}

string vertex::toString()
{
	string str=getName();
	cout &lt;&lt; &quot;Printing vertex: &quot; &lt;&lt; str &lt;&lt; endl;
	str.append(&quot; at (&quot;);
	str.append(doubleToString(coords.x()));
	str.append(&quot;|&quot;);
	str.append(doubleToString(coords.y()));
	str.append(&quot;), has &quot;);

	stringstream tmp;
	tmp &lt;&lt; neighbours.size();
	str.append(tmp.str());

	str.append(&quot; neighbours: |&quot;);

	for (vector &lt;vertex*&gt;::iterator it = neighbours.begin(); it != neighbours.end(); ++it) 
	{
		cout &lt;&lt; &quot;Found neighbour &quot;&lt;&lt; (*it)-&gt;getName() &lt;&lt; endl; // diese dereferenzierung geht schief
		str.append((*it)-&gt;getName()); /
		str.append(&quot;|&quot;);
	}

	return str;
}

string vertex::getName()
{
	return name;
}
</code></pre>
<p>Der eingelesene Graph sieht folgendermassen aus und wird von bison und flex geparst (der von bison generierte parser ruft die Funktionen addVertex() und addEdge() auf)</p>
<p>graph graphname {<br />
a -- b -- c;<br />
}</p>
<p>Ausgabe:<br />
c: 0x9f162b0, b: 0x9f16288<br />
c to b<br />
b: 0x9f16288, c: 0x9f162b0<br />
b to c<br />
b: 0x9f16330, a: 0x9f16380<br />
b to a<br />
a: 0x9f16380, b: 0x9f16330<br />
a to b<br />
Anzahl der Knoten: 3<br />
Printing vertex: b<br />
zsh: segmentation fault (core dumped)</p>
<p>So, ich hoffe ich habe alles gepasted was zur Loesung beitragen kann.<br />
Das seltsame an diesem Problem ist, dass ich die Pointer eben beim hinzufuegen zum neighbours vector dereferenzieren kann und per getName() den namen auslesen kann, wenn ich aber die liste durchgehe, klappt das nicht mehr, sobald mehr als 3 Knoten im Spiel sind.</p>
<p>Danke schonmal fuer das lesen des vielen Textes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898724</guid><dc:creator><![CDATA[leche]]></dc:creator><pubDate>Tue, 18 May 2010 01:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 05:52:47 GMT]]></title><description><![CDATA[<p>So auf die Schnelle seh ich nicht den Fehler im Code, allerdings einen kleinen anderen Abschnitt der einen Kommentar verdient:</p>
<p>leche schrieb:</p>
<blockquote>
<pre><code class="language-cpp">graph::graph()
{
	vertexList = new vector&lt;vertex&gt;;
	if (vertexList == NULL)
	{
		cerr &lt;&lt; &quot;Error, could not allocate enough memory&quot; &lt;&lt; endl;
	}
}
</code></pre>
</blockquote>
<p>Die Überprüfung auf NULL ist überflüssig, da die Bedingung <strong>niemals</strong> wahr sein kann. new wirft eine Exception, wenn der Speicher nicht allokiert werden kann. Es würde funktionieren, wenn du dem new das nothrow Argument mit übergibst - aber in der Regel will man das gar nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898739</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Tue, 18 May 2010 05:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 07:13:09 GMT]]></title><description><![CDATA[<p>Fehler hab ich jetzt auch keinen wirklichen gesehen. Hast du schon debuggt? Steigt das ganze sicher an der stelle aus? Vielleicht sind die Iteratoren auch ungültig? Ist der Neighbours vektor korrekt aufgebaut? Das sind jetzt Ansätze die ich als erstes Probieren würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898771</guid><dc:creator><![CDATA[Fedaykin]]></dc:creator><pubDate>Tue, 18 May 2010 07:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 08:33:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">vertex* graph::findVertexByName(string name)
</code></pre>
<p>liefert einen Pointer auf dein Element im vector.<br />
Wenn du jetzt allerdings einen neuen Vertex hinzufügst, dann<br />
kann dieser, wenn der vector seinen Speicherplatz neuallokieren muss,<br />
ungültig werden, so dass dein 'addNeighbour()' später auf einen ungültigen<br />
Speicherbereich verweist.</p>
<p>Soweit jedenfalls meine Vermutung....</p>
<p>EDIT: In welcher Reihenfolge wird denn hinzugefügt?<br />
EDIT 2: Mach dir mal Debug-Ausgaben in den Copy-Constructor von vertex,<br />
wenn aufeinmal alle Elemente kopiert werden, allokiert der vector (wahrscheinlich)<br />
neu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898800</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 May 2010 08:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 09:37:36 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>So auf die Schnelle seh ich nicht den Fehler im Code, allerdings einen kleinen anderen Abschnitt der einen Kommentar verdient:</p>
<p>leche schrieb:</p>
<blockquote>
<pre><code class="language-cpp">graph::graph()
{
	vertexList = new vector&lt;vertex&gt;;
	if (vertexList == NULL)b
	{
		cerr &lt;&lt; &quot;Error, could not allocate enough memory&quot; &lt;&lt; endl;
	}
}
</code></pre>
</blockquote>
<p>Die Überprüfung auf NULL ist überflüssig, da die Bedingung <strong>niemals</strong> wahr sein kann. new wirft eine Exception, wenn der Speicher nicht allokiert werden kann. Es würde funktionieren, wenn du dem new das nothrow Argument mit übergibst - aber in der Regel will man das gar nicht.</p>
</blockquote>
<p>Danke, das wusste ich noch nicht, hatte es mir irgendwie angewohnt angeforderten Heap Speicher zu überprüfen <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>
<p>Cspille: Sprich ich müsste den copy constructor überladen und alle Pointer anpassen (falls das das Problem ist, ich prüfe es gerade nach)?</p>
<p>Edit: Oder wäre das Problem behoben, wenn ich keine Pointer sondern Referenzen speichere?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898845</guid><dc:creator><![CDATA[leche]]></dc:creator><pubDate>Tue, 18 May 2010 09:37:36 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 09:38:44 GMT]]></title><description><![CDATA[<p>Warum speicherst du in der Klasse <code>graph</code> einen <code>std::vector&lt;vertex&gt;*</code> und keinen <code>std::vector&lt;vertex&gt;</code> ? Durch den Zeiger bekommst du viele Probleme und musst manuell Speicher verwalten. Wenn eine Klasse nur Wert-Objekte hat, ist die Überladung von Kopierkonstruktor, Zuweisungsoperator und Destruktor in der Regel unnötig, weil bereits die vom Compiler generierten Versionen das Richtige tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898874</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 May 2010 09:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to segmentation fault bei Dereferenzierung eines Pointers on Tue, 18 May 2010 20:05:42 GMT]]></title><description><![CDATA[<p>Der vollstaendigkeit halber,</p>
<p>nach einer kleinen emailkonferenz mit Cspille (danke nochmal) speichere ich meine Knoten nun in einer std::list, die die Objekte nur einmal kopiert (da als linked list implementiert?) werden und so die Pointer konsistent bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899256</guid><dc:creator><![CDATA[leche]]></dc:creator><pubDate>Tue, 18 May 2010 20:05:42 GMT</pubDate></item></channel></rss>