<?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[Speicherfehler am Anfang eines Vektors]]></title><description><![CDATA[<p>Hallo, habe ein Problem mit einem Vektor, ich weiss jedoch noch nicht genau, wo der fehler liegt. Daher schreibe ich mal das nötigste.<br />
Ich habe mir eine eigene Klasse mTrace geschrieben mit einem vector...</p>
<pre><code class="language-cpp">class mTrace{
public:
...
	/// add a point to the trace
	void addPoint(const mPoint&amp; pt){points_.push_back(pt);};
private:
    int a_;
    int b_;
    std::vector&lt;mPoint&gt; points_;
</code></pre>
<p>Diese Klasse brauche ich beim einlesen einer xml-Datei mittels tinyXML</p>
<pre><code class="language-cpp">...
mTrace nodeToTrace(TiXmlElement* e) {

	if (strcmp(e-&gt;Value(), &quot;Trace&quot;) != 0)
		throw runtime_error(string(&quot;wrong trace &quot;) + e-&gt;Value());

	mTrace result;

        ...

	if (result.points().empty()) {// TODO Speicherkorrektur
		result.addPoint(mPoint(0, 0));
	}

	for (TiXmlElement* element = e-&gt;FirstChildElement(); element; element = element-&gt;NextSiblingElement()) {
		result.addPoint(nodeToPoint(element));
	}

	return result;
}
...
</code></pre>
<p>Beim einlesen habe ich nun das Problem, dass das erste element des Vectors sich zur Laufzeit variiert, d.h. bei jedem Durchlauf der funtkion verändern sich die Werte des ersten Elementes im Vector. Alle anderen stimmen. Da ich bisher keine Lösung des Problems gefunden habe, habe ich es ignoriert, indem ich einfach ein leeres Element hinzugefügt habe (siehe TODO) und bei den Schleifen erst ab dem nächsten Element angefangen habe zu zählen. Keine schöne Art, hat aber funktioniert. Nun muss aber eine Lösung her, da ich die Vektoren teilweise umdrehen muss und somit mein Behilf nicht mehr funktioniert.<br />
Wenn ich nun versuche, das erste Element zu löschen, bekomme ich folgenden Fehler</p>
<pre><code class="language-cpp">result.trace(1).points().erase( result.trace(1).points().begin() );
</code></pre>
<p>vector::_M_range_check</p>
<p>Für Ideen und Vorschläge bin ich gerne zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233404/speicherfehler-am-anfang-eines-vektors</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 00:15:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233404.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Feb 2009 10:11:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 10:11:41 GMT]]></title><description><![CDATA[<p>Hallo, habe ein Problem mit einem Vektor, ich weiss jedoch noch nicht genau, wo der fehler liegt. Daher schreibe ich mal das nötigste.<br />
Ich habe mir eine eigene Klasse mTrace geschrieben mit einem vector...</p>
<pre><code class="language-cpp">class mTrace{
public:
...
	/// add a point to the trace
	void addPoint(const mPoint&amp; pt){points_.push_back(pt);};
private:
    int a_;
    int b_;
    std::vector&lt;mPoint&gt; points_;
</code></pre>
<p>Diese Klasse brauche ich beim einlesen einer xml-Datei mittels tinyXML</p>
<pre><code class="language-cpp">...
mTrace nodeToTrace(TiXmlElement* e) {

	if (strcmp(e-&gt;Value(), &quot;Trace&quot;) != 0)
		throw runtime_error(string(&quot;wrong trace &quot;) + e-&gt;Value());

	mTrace result;

        ...

	if (result.points().empty()) {// TODO Speicherkorrektur
		result.addPoint(mPoint(0, 0));
	}

	for (TiXmlElement* element = e-&gt;FirstChildElement(); element; element = element-&gt;NextSiblingElement()) {
		result.addPoint(nodeToPoint(element));
	}

	return result;
}
...
</code></pre>
<p>Beim einlesen habe ich nun das Problem, dass das erste element des Vectors sich zur Laufzeit variiert, d.h. bei jedem Durchlauf der funtkion verändern sich die Werte des ersten Elementes im Vector. Alle anderen stimmen. Da ich bisher keine Lösung des Problems gefunden habe, habe ich es ignoriert, indem ich einfach ein leeres Element hinzugefügt habe (siehe TODO) und bei den Schleifen erst ab dem nächsten Element angefangen habe zu zählen. Keine schöne Art, hat aber funktioniert. Nun muss aber eine Lösung her, da ich die Vektoren teilweise umdrehen muss und somit mein Behilf nicht mehr funktioniert.<br />
Wenn ich nun versuche, das erste Element zu löschen, bekomme ich folgenden Fehler</p>
<pre><code class="language-cpp">result.trace(1).points().erase( result.trace(1).points().begin() );
</code></pre>
<p>vector::_M_range_check</p>
<p>Für Ideen und Vorschläge bin ich gerne zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657714</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 04 Feb 2009 10:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 10:59:14 GMT]]></title><description><![CDATA[<p>Kann du mal den erase-Aufruf zeigen, kann aus der Fehlermeldung eigentlich herauslesen, daß du außerhalb eines Vectors auf Elemente zugreifen willst.</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657743</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Wed, 04 Feb 2009 10:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:14:18 GMT]]></title><description><![CDATA[<p>Der erase-Befehl steht im Posting. Schreibe ihn aber gerne nochmal.<br />
Kann eigentlich kein zugriffsfehler sein, da ich den Zeiger auf begin() setze.</p>
<pre><code class="language-cpp">result.trace(1).points().erase( result.trace(1).points().begin() );
</code></pre>
<p>vector::_M_range_check</p>
<p>und eine kleine Ergänzung der Funktion points()...</p>
<pre><code class="language-cpp">class mTrace{
public:
...
    /// returns the Points from the Trace
    std::vector&lt;mPoint&gt; points() const {return points_;};
    /// add a point to the trace
    void addPoint(const mPoint&amp; pt){points_.push_back(pt);};
private:
    int a_;
    int b_;
    std::vector&lt;mPoint&gt; points_;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1657750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657750</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:14:18 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:18:45 GMT]]></title><description><![CDATA[<p>Flaut schrieb:</p>
<blockquote>
<p>Kann eigentlich kein zugriffsfehler sein, da ich den Zeiger auf begin() setze.</p>
</blockquote>
<p>Sicher, dass der vector nicht leer ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657753</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:18:45 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:19:33 GMT]]></title><description><![CDATA[<p>Was gibt trace(1) zurück? Ist das ein Zugriff auf eine darüberliegende Datenstruktur oder sowas?</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657754</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:21:44 GMT]]></title><description><![CDATA[<p>points() gibt eine Kopie des Vektors zurück. Das erase wird auf einer anderen Kopie des Vektors aufgerufen als das begin.</p>
<p>Gruss Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657755</guid><dc:creator><![CDATA[Chrisi_K]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:32:25 GMT]]></title><description><![CDATA[<p>Stimmt, jetzt wo du es sagst :-). Fix wäre die Referenz auf points_ zurückzugeben. Allerdings darf die get-Methode dann nicht mehr const sein und sowas ist nicht gerade feier Stil.</p>
<p>Gruß Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657759</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 11:38:38 GMT]]></title><description><![CDATA[<p>Dann gib der Klasse mTrace doch einfach ne Methode zum Point-Löschen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1657763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657763</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 04 Feb 2009 11:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 13:09:12 GMT]]></title><description><![CDATA[<p>habe die löschen methode geschrieben, aber ich habe noch immer den gleichen Speicherfehler. Vermutlich, da es sich wieder um eine Kopie handelt?</p>
<pre><code class="language-cpp">...
vector&lt;mPoint&gt;::iterator it = result.trace(1).points().begin();
result.trace(1).remPoint( it );
...
</code></pre>
<pre><code class="language-cpp">class mTrace{
public:
...
    /// returns the Points from the Trace
    std::vector&lt;mPoint&gt; points() const {return points_;};
    /// remove a point from the trace
    void remPoint(const std::vector&lt;mPoint&gt;::iterator &amp;pos){points_.erase(pos);};
    /// add a point to the trace
    void addPoint(const mPoint&amp; pt){points_.push_back(pt);};
private:
    int a_;
    int b_;
    std::vector&lt;mPoint&gt; points_;
</code></pre>
<p>Aber das ist ja immer noch eine Korrektur, die ja das eigentliche Problem nicht löst. Denn das erste Element des Vektors variiert und dort sitzt der Unruhestifter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657808</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Wed, 04 Feb 2009 13:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 13:24:15 GMT]]></title><description><![CDATA[<p>Flaut schrieb:</p>
<blockquote>
<p>habe die löschen methode geschrieben, aber ich habe noch immer den gleichen Speicherfehler. Vermutlich, da es sich wieder um eine Kopie handelt?</p>
</blockquote>
<p>Ja, weil points() immernoch eine Kopie zurückliefert. Lasse points() eine konstante Referenz zurückliefern (oder eine nicht-konstante Referenz, aber dann brauchst Du remPoint() nicht mehr).</p>
<blockquote>
<p>Aber das ist ja immer noch eine Korrektur, die ja das eigentliche Problem nicht löst. Denn das erste Element des Vektors variiert und dort sitzt der Unruhestifter.</p>
</blockquote>
<p>Möchlich, dass das aus einer ähnlichen Situation herrührt - benutzt Du vielleicht irgendwo den Iterator einer Kopie als Einfügeposition für einen Vector?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657815</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 04 Feb 2009 13:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Wed, 04 Feb 2009 13:47:31 GMT]]></title><description><![CDATA[<p>Die Methode &quot;remPoint&quot; könnte auch einen Index entgegennehmen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657840</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 04 Feb 2009 13:47:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfehler am Anfang eines Vektors on Thu, 05 Feb 2009 09:35:52 GMT]]></title><description><![CDATA[<p>Wie kann ich denn die Referenz zurück geben? Ich kann doch in meiner Klasse keine Funktion schreiben, in der ich ein eigenes Element als Referenz bekomme? sonst bin ich wieder bei einer Kopie. Steh ich jetzt auf der Leitung? Ich muss doch auf meinen Vektor in der Klasse zugreifen können, ohne eine Kopie des Vektors, das ist ja auch sehr Speicherhungrig.</p>
<p>und beim Ursprungsproblem nutze ich keinen Iterator. Ich lese mittels nodeToTrace ein, erzeuge mir dort eine Instanz vom Typ mTrace, setze die Werte und gebe die Instanz als Rückgabewert zurück.</p>
<pre><code class="language-cpp">mTrace nodeToTrace(TiXmlElement* e) {

	if (strcmp(e-&gt;Value(), &quot;Trace&quot;) != 0)
		throw runtime_error(string(&quot;wrong trace &quot;) + e-&gt;Value());

	mTrace result;
	const char *traceID, *color, *numPoints;

	//read Parameter
	traceID = e-&gt;Attribute(&quot;traceID&quot;);
	if (traceID != NULL)
		result.setTraceID(atoi(traceID));
	else
		throw runtime_error(string(&quot;wrong traceID &quot;) + e-&gt;Value());

	color = e-&gt;Attribute(&quot;color&quot;);
	if (color != NULL)
		result.setColor(atoi(color));
	else
		throw runtime_error(string(&quot;wrong color &quot;) + e-&gt;Value());

	numPoints = e-&gt;Attribute(&quot;numPoints&quot;);
	if (numPoints != NULL)
		result.setNumPoints(atoi(numPoints));
	else
		throw runtime_error(string(&quot;wrong numPoints &quot;) + e-&gt;Value());

	if (result.points().empty()) {// TODO Speicherkorrektur
		result.addPoint(mPoint(0, 0));
	}

	for (TiXmlElement* element = e-&gt;FirstChildElement(); element; element = element-&gt;NextSiblingElement()) {
		result.addPoint(nodeToPoint(element));
	}

	return result;
}
</code></pre>
<p>Dies mache ich geschachtelt, aber immer auf die gleiche Weise readXML(mStructure(mTrace(mPoint()))).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1657940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1657940</guid><dc:creator><![CDATA[Flaut]]></dc:creator><pubDate>Thu, 05 Feb 2009 09:35:52 GMT</pubDate></item></channel></rss>