<?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[Speichernutzungsverhalten von STL-Vector und Konsorten]]></title><description><![CDATA[<p>Hallo alle.</p>
<p>Ich schreibe gerade an einem größeren C++ Projekt und habe mir scheinbar auf dem Weg einen hässlichen bug eingehandelt der mir (glaube ich) stack corruption beschert. Symptome: Programm crasht mit Speicherzugriffsverletzungen an zufälligen (aber je nach user input und RNG-Seed reproduzierbaren) Stellen, teilweise &quot;während&quot; eines returns.</p>
<p>Ich habe soweit möglich STL Objekte und auch Algorithmen verwendet, um die typischen memory allocation Fehler und fencepost errors von vornherein auszuschließen.</p>
<p>Meine eigentliche Frage:<br />
std::vector ist soweit ich weiß im wesentlichen ein Wrapper für C-style arrays, die dynamisch (also auf dem heap) allokiert werden. Wenn also ein Objekt eine Matrix in Form eines vector&lt;vector&lt;unsigned&gt; &gt; als Membervariabel enthält, wird auf dem Stack im wesentlichen nur ein &quot;Pointer&quot; auf den Speicherbereich des äußeren vectors gespeichert? Ich frage, weil ich teilweise potenziell recht lange std::lists und std::vectors by value returnen muss, und ich möchte ausschließen, dass die beim returnen angelegte Kopie mir den stack corrupted oder überlaufen lässt.</p>
<p>Als Bonusantwort (natürlich schwer ohne ein paar Stunden/Tage mit dem Code zu verbringen): Gibt es noch andere &quot;typische&quot; Fehler die man mit der STL machen kann, die das beschriebene Verhalten hervorrufen?</p>
<p>Danke,</p>
<p>Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241791/speichernutzungsverhalten-von-stl-vector-und-konsorten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 07:33:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241791.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 May 2009 08:06:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 08:06:22 GMT]]></title><description><![CDATA[<p>Hallo alle.</p>
<p>Ich schreibe gerade an einem größeren C++ Projekt und habe mir scheinbar auf dem Weg einen hässlichen bug eingehandelt der mir (glaube ich) stack corruption beschert. Symptome: Programm crasht mit Speicherzugriffsverletzungen an zufälligen (aber je nach user input und RNG-Seed reproduzierbaren) Stellen, teilweise &quot;während&quot; eines returns.</p>
<p>Ich habe soweit möglich STL Objekte und auch Algorithmen verwendet, um die typischen memory allocation Fehler und fencepost errors von vornherein auszuschließen.</p>
<p>Meine eigentliche Frage:<br />
std::vector ist soweit ich weiß im wesentlichen ein Wrapper für C-style arrays, die dynamisch (also auf dem heap) allokiert werden. Wenn also ein Objekt eine Matrix in Form eines vector&lt;vector&lt;unsigned&gt; &gt; als Membervariabel enthält, wird auf dem Stack im wesentlichen nur ein &quot;Pointer&quot; auf den Speicherbereich des äußeren vectors gespeichert? Ich frage, weil ich teilweise potenziell recht lange std::lists und std::vectors by value returnen muss, und ich möchte ausschließen, dass die beim returnen angelegte Kopie mir den stack corrupted oder überlaufen lässt.</p>
<p>Als Bonusantwort (natürlich schwer ohne ein paar Stunden/Tage mit dem Code zu verbringen): Gibt es noch andere &quot;typische&quot; Fehler die man mit der STL machen kann, die das beschriebene Verhalten hervorrufen?</p>
<p>Danke,</p>
<p>Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715823</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Tue, 26 May 2009 08:06:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 08:11:21 GMT]]></title><description><![CDATA[<p>standard fehler ist, dass die elemente die du speicherst nicht korrekt kopiert werden. geh mit nem debugger durch. der fehler liegt ziemlich sicher nicht an der stl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715825</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 26 May 2009 08:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 08:13:09 GMT]]></title><description><![CDATA[<p>Ja, Vectoren sind im Prinzip Wrapper für normale Arrays mit dynmaischer Speicherdauer.<br />
Ein typischer Fehler, den man machen kann, ist das Arbeiten mit invalidierten Iteratoren oder invalidierten Zeigern auf Objekte in Containern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715826</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 26 May 2009 08:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 08:35:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich frage, weil ich teilweise potenziell recht lange std::lists und std::vectors by value returnen muss, und ich möchte ausschließen, dass die beim returnen angelegte Kopie mir den stack corrupted oder überlaufen lässt.</p>
</blockquote>
<p>sizeof(std::vector) ist unabhaengig von seiner Laenge oder dessen Inhalt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715835</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 26 May 2009 08:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 10:05:32 GMT]]></title><description><![CDATA[<p>ich vermute dass der vector im speicher fragmentiert vorliegen kann, da ich zufällig abstürze bekommen habe, als ich nach einem resize mit memcpy zusammenhängende daten in den freien speicher laden wollte. man musste erst die std::copy etc funktionen benutzen, damit alles wieder funktionierte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715897</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Tue, 26 May 2009 10:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 10:09:34 GMT]]></title><description><![CDATA[<blockquote>
<p>ich vermute dass der vector im speicher fragmentiert vorliegen kann,</p>
</blockquote>
<p>Kann er nicht (seit dem Corrigendum von 2003).<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715900</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 26 May 2009 10:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 11:55:48 GMT]]></title><description><![CDATA[<p>Wird memcpy genutzt? Bleibst du immer innerhalb der Grenzen des Arrays/Vectoren?</p>
<p>Bedenke: Nur wenn du <a href="http://vector.at" rel="nofollow">vector.at</a>() nutzt prüft der Vector die Bounds, bei operator[] wird nicht geprüft!</p>
<p>Ansonsten jag doch mal valgrind auf dein Programm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715974</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Tue, 26 May 2009 11:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:05:36 GMT]]></title><description><![CDATA[<p>ich blieb innerhalb der vectorgrenzen. aber es kam bei sehr großen dateninhalten sporadisch zum programmabsturz ohne assert. bei kleinen datenmengen funktionierte memcpy. das hat mich auch nicht sonderlich verwundert, da ich generell von std::vector nicht viel halte. aber es ist doch verwunderlich zumindest funktioniert die klasse wenn man bei std::copy bleibt. aber ansonsten sollte man erwägen immer selbst ein array mit eigenen []-operatorenm zu implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715984</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Tue, 26 May 2009 12:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:09:01 GMT]]></title><description><![CDATA[<p>dgrat schrieb:</p>
<blockquote>
<p>das hat mich auch nicht sonderlich verwundert, da ich generell von std::vector nicht viel halte.</p>
</blockquote>
<p>Wundert mich nicht, wenn jemand gegen die Implementierung statt gegen die Schnittstelle programmiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715988</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 26 May 2009 12:09:01 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:09:22 GMT]]></title><description><![CDATA[<p>wenn du einen vector&lt;string&gt; oder vector&lt;vector&gt; hast und memcpy benutzt, wird die kiste auch irgendwann abstürzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1715989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1715989</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 26 May 2009 12:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:30:08 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, hat mir einige hilfreiche Ansatzpunkte geboten. Habe jetzt mal konsequent copy constructors, Zuweisungs- und Vergleichsoperatoren für meine Klassen geschrieben. Mir sind dabei zwar einige mögliche issues aufgefallen, die ich jetzt abfangen kann, aber das wars scheinbar nicht (leider). Werde mal weiter rumsuchen.</p>
<p>Was valgrind angeht - ich bin leider auf ein Windowssystem beschränkt, muss da mal beim Chef etwas Lobbyarbeit betreiben. Nervt mich eh schon die ganze Zeit, dass die meisten guten Tools nicht laufen ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716005</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Tue, 26 May 2009 12:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:32:32 GMT]]></title><description><![CDATA[<p>Für Windows gibts den Application Verifier.</p>
<p>BTW: Wenn Du schon Copy DTOR und Assignment Operator gemacht hast, dürfte ein DTOR auch angebracht sein.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716008</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 26 May 2009 12:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:44:36 GMT]]></title><description><![CDATA[<p>Destruktoren schreibe ich immer, selbst wenn sie leer sind. Mit denen hatte ich schon zu viel Ärger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716021</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Tue, 26 May 2009 12:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:45:48 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Für Windows gibts den Application Verifier.</p>
</blockquote>
<p>Sofern man MS Visual Studio verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716024</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 26 May 2009 12:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:46:34 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Für Windows gibts den Application Verifier.</p>
</blockquote>
<p>Sofern man MS Visual Studio verwendet.</p>
</blockquote>
<p>Die Alternative dazu wäre doch wohl MinGW, und für den gibts afaik auch valgrind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716026</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Tue, 26 May 2009 12:46:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:52:33 GMT]]></title><description><![CDATA[<p>The-Kenny schrieb:</p>
<blockquote>
<p>Die Alternative dazu wäre doch wohl MinGW, und für den gibts afaik auch valgrind.</p>
</blockquote>
<p>Aber nicht für Windows. Es gibt eine unter wine lauffähige Variante aber das wars auch schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716029</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 26 May 2009 12:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 12:54:15 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>theta schrieb:</p>
<blockquote>
<p>Für Windows gibts den Application Verifier.</p>
</blockquote>
<p>Sofern man MS Visual Studio verwendet.</p>
</blockquote>
<p>Muss nicht sein, kann auch separat gestartet werden.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716030</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 26 May 2009 12:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 13:21:02 GMT]]></title><description><![CDATA[<p>Daniel der Gast schrieb:</p>
<blockquote>
<p>...aber das wars scheinbar nicht (leider).</p>
</blockquote>
<p>Das memcpy nicht unbedingt für Objekte geeignet ist, hast du aber auch verstanden? Und dabei ist es egal ob du auf C-Arrays oder std::vector setzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716056</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 26 May 2009 13:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 16:16:23 GMT]]></title><description><![CDATA[<p>Memcpy verwende ich nicht. Alles was void* returned ist eh potenziell pfui ^^</p>
<p>Ich _glaube_ übrigens ich hab den bug exterminiert, kann aber nicht mit Sicherheit sagen, was genau es war. Habe ein größeres refactoring der Methode gemacht, die den Fehler scheinbar verursacht hat, jetzt läufts (wohl).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716189</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Tue, 26 May 2009 16:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 16:17:22 GMT]]></title><description><![CDATA[<p>Übrigens bin ich nicht identisch mit dgrat (nur um Verwirrung vorzubeugen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716191</guid><dc:creator><![CDATA[Daniel der Gast]]></dc:creator><pubDate>Tue, 26 May 2009 16:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 18:36:48 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>dgrat schrieb:</p>
<blockquote>
<p>das hat mich auch nicht sonderlich verwundert, da ich generell von std::vector nicht viel halte.</p>
</blockquote>
<p>Wundert mich nicht, wenn jemand gegen die Implementierung statt gegen die Schnittstelle programmiert.</p>
</blockquote>
<p>zynismus ist die sprache schwacher geister.. vermutlich weiste selbser bicht, warum der fehler auftritt.</p>
<p>aber volkard hat wieder recht, in meinem fall bewirkt vector&lt;vector&gt; eine speicherfragmentierung, weil die daten, die wichtig behandelt werden, leider nicht hintereinanderliegen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716319</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Tue, 26 May 2009 18:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 19:03:25 GMT]]></title><description><![CDATA[<p>dgrat schrieb:</p>
<blockquote>
<p>zynismus ist die sprache schwacher geister..</p>
</blockquote>
<p>Naja, es ist ein wenig einfach, dem <code>vector</code> mal grundsätzlich die Schuld in die Schuhe zu schieben, weil man persönliche (wahrscheinlich noch unbegründete) Abneigungen besitzt.</p>
<p>dgrat schrieb:</p>
<blockquote>
<p>aber volkard hat wieder recht, in meinem fall bewirkt vector&lt;vector&gt; eine speicherfragmentierung, weil die daten, die wichtig behandelt werden, leider nicht hintereinanderliegen...</p>
</blockquote>
<p>Dann benutzt du eben nicht <code>memcpy()</code> . Sobald nämlich mehr als nur PODs vorliegen, erzielst du damit undefiniertes Verhalten.</p>
<p>Und dass ein verschachtelter <code>std::vector</code> nicht alle Elemente linear hintereinander im Speicher halten kann, dürfte zu erwarten sein. Entweder man kopiert die inneren Container einzeln oder benutzt einen anderen Aufbau der Datenstruktur (eindimensionaler <code>std::vector</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716340</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 26 May 2009 19:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speichernutzungsverhalten von STL-Vector und Konsorten on Tue, 26 May 2009 20:27:06 GMT]]></title><description><![CDATA[<p>dgrat schrieb:</p>
<blockquote>
<p>vermutlich weiste selbser bicht, warum der fehler auftritt.</p>
</blockquote>
<p>Mein Persönlicher Verdacht wurde bereits im 2ten Post geäußert, zudem habe ich schon selbst genügend Fehler in Programmen gebaut um auch das Verhalten durchaus zu kennen. Die Ablehnung wiederum vom std::vector, und das zurückgreifen wollen auf eine selbstgebaute Lösung die auf das gleiche hinausläuft ist mehr als Schwachsinn.</p>
<p>Die Macher der Standardbibliothek haben sich schon gute Gedanken gemacht (Und ich behaupte mal das man die Standardbibliothek, gerade bei aktuellen Compilern weitgehend Fehlerfrei bezeichnen kann - vermutlich besser getestet als du es jemals in eigenen Programmteilen hinbekommen wirst).</p>
<p>Es gibt sicherlich auch Punkte die man daran aussetzen kann, aber das was du mit memcpy betreibst funktioniert auch mit C-Arrays nicht (Zumindestens nicht mit vielen Objekttypen).</p>
<p>Und das du mein Abgewandeltes Zitat nicht kennst und darauf auf einen &quot;schwachen Geist&quot; schließt, zeigt mir nur das du nicht wirklich viele Fachbücher kennst, die sich auch mit OO und C++ auseinander setzen (&quot;Programmiere gegen die Schnittstelle, und nicht gegen die Implementierung&quot; ist nicht ohne Grund einer der häufigsten Zitate die ich aus Fachbüchern kenne).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1716397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1716397</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 26 May 2009 20:27:06 GMT</pubDate></item></channel></rss>