<?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[Speicher-Leak bei push_back]]></title><description><![CDATA[<p>Hallo!</p>
<p>Valgrind schickt mir folgende Fehlermeldung:</p>
<blockquote>
<p>&gt; ==25573==<br />
&gt; ==25573== HEAP SUMMARY:<br />
&gt; ==25573== in use at exit: 8 bytes in 1 blocks<br />
&gt; ==25573== total heap usage: 99 allocs, 98 frees, 2,126 bytes<br />
&gt; allocated<br />
&gt; ==25573==<br />
&gt; ==25573== 8 bytes in 1 blocks are definitely lost in loss record 1 of &gt; 1<br />
&gt; ==25573== at 0x402471C: operator new(unsigned int)<br />
&gt; (vg_replace_malloc.c:255)<br />
&gt; ==25573== by 0x8053B01:<br />
&gt; __gnu_cxx::new_allocator&lt;int&gt;::allocate(unsigned int, void const*)<br />
&gt; (new_allocator.h:89)<br />
&gt; ==25573== by 0x80539EF: std::_Vector_base&lt;int, std::allocator&lt;int&gt; &gt; &gt;::_M_allocate(unsigned<br />
&gt; int) (stl_vector.h:140)<br />
&gt; ==25573== by 0x805362C: std::vector&lt;int, std::allocator&lt;int&gt;<br />
&gt; &gt;::_M_insert_aux(__gnu_cxx::__n<br />
&gt; ormal_iterator&lt;int*, std::vector&lt;int, std::allocator&lt;int&gt; &gt; &gt;, int<br />
&gt; const&amp;) (vector.tcc:322)<br />
&gt; ==25573== by 0x8053448: std::vector&lt;int, std::allocator&lt;int&gt;<br />
&gt; &gt;::push_back(int const&amp;)<br />
&gt; (stl_vector.h:741)<br />
&gt; ==25573== by 0x80526A1: Man::mayhit(int, int, int, int, char,<br />
&gt; char, Draughts&amp;, char, int&amp;)<br />
&gt; (Man.cpp:236)<br />
&gt; ==25573== by 0x8052B32: Man::maymove(int, int, Draughts&amp;, int&amp;)<br />
&gt; (Man.cpp:346)<br />
&gt; ==25573== by 0x8054770: Move::execute(Draughts&amp;,<br />
&gt; std::vector&lt;std::string,<br />
&gt; std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;) (Move.cpp:109)<br />
&gt; ==25573== by 0x804DAF7: Draughts::run() (Draughts.cpp:226)<br />
&gt; ==25573== by 0x8049992: main (main.cpp:65)<br />
&gt; ==25573==</p>
</blockquote>
<p>Der Teil des Codes, wo das Problem auftritt ist folgender:</p>
<pre><code class="language-cpp">if(count_hit == high_hit)
{
  max_startpositions.push_back(helper);
}

else if(count_hit &gt; high_hit)
{
  high_hit = count_hit;
  for (counter = max_startpositions.size(); counter &gt; 0; counter--)
  {
    max_startpositions.pop_back();
  }
  max_startpositions.push_back(helper);
}
</code></pre>
<p>Wir leeren also den Vektor, wenn ein Stein gefunden wurde der mehr gegnereische Steine schlagen kann. Danach fügen wir diesen hinzu<br />
---&gt; geht ohne Leaks!</p>
<p>Sollte sich jetzt ein Stein finden, welcher gleich oft schlagen kann, wird dieser dem Vektor hinzugefügt ---&gt; geht korrekt und es gibt auch in weiterer Folge keine Probleme mit dem Programm, aber eben das Speicher-Leak. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /></p>
<p>Was ist der Grund? Bitte um Hilfe!</p>
<p>Liebe Grüße <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/topic/308287/speicher-leak-bei-push_back</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 21:12:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308287.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Sep 2012 08:50:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 08:50:52 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Valgrind schickt mir folgende Fehlermeldung:</p>
<blockquote>
<p>&gt; ==25573==<br />
&gt; ==25573== HEAP SUMMARY:<br />
&gt; ==25573== in use at exit: 8 bytes in 1 blocks<br />
&gt; ==25573== total heap usage: 99 allocs, 98 frees, 2,126 bytes<br />
&gt; allocated<br />
&gt; ==25573==<br />
&gt; ==25573== 8 bytes in 1 blocks are definitely lost in loss record 1 of &gt; 1<br />
&gt; ==25573== at 0x402471C: operator new(unsigned int)<br />
&gt; (vg_replace_malloc.c:255)<br />
&gt; ==25573== by 0x8053B01:<br />
&gt; __gnu_cxx::new_allocator&lt;int&gt;::allocate(unsigned int, void const*)<br />
&gt; (new_allocator.h:89)<br />
&gt; ==25573== by 0x80539EF: std::_Vector_base&lt;int, std::allocator&lt;int&gt; &gt; &gt;::_M_allocate(unsigned<br />
&gt; int) (stl_vector.h:140)<br />
&gt; ==25573== by 0x805362C: std::vector&lt;int, std::allocator&lt;int&gt;<br />
&gt; &gt;::_M_insert_aux(__gnu_cxx::__n<br />
&gt; ormal_iterator&lt;int*, std::vector&lt;int, std::allocator&lt;int&gt; &gt; &gt;, int<br />
&gt; const&amp;) (vector.tcc:322)<br />
&gt; ==25573== by 0x8053448: std::vector&lt;int, std::allocator&lt;int&gt;<br />
&gt; &gt;::push_back(int const&amp;)<br />
&gt; (stl_vector.h:741)<br />
&gt; ==25573== by 0x80526A1: Man::mayhit(int, int, int, int, char,<br />
&gt; char, Draughts&amp;, char, int&amp;)<br />
&gt; (Man.cpp:236)<br />
&gt; ==25573== by 0x8052B32: Man::maymove(int, int, Draughts&amp;, int&amp;)<br />
&gt; (Man.cpp:346)<br />
&gt; ==25573== by 0x8054770: Move::execute(Draughts&amp;,<br />
&gt; std::vector&lt;std::string,<br />
&gt; std::allocator<a href="std::string" rel="nofollow">std::string</a> &gt;&amp;) (Move.cpp:109)<br />
&gt; ==25573== by 0x804DAF7: Draughts::run() (Draughts.cpp:226)<br />
&gt; ==25573== by 0x8049992: main (main.cpp:65)<br />
&gt; ==25573==</p>
</blockquote>
<p>Der Teil des Codes, wo das Problem auftritt ist folgender:</p>
<pre><code class="language-cpp">if(count_hit == high_hit)
{
  max_startpositions.push_back(helper);
}

else if(count_hit &gt; high_hit)
{
  high_hit = count_hit;
  for (counter = max_startpositions.size(); counter &gt; 0; counter--)
  {
    max_startpositions.pop_back();
  }
  max_startpositions.push_back(helper);
}
</code></pre>
<p>Wir leeren also den Vektor, wenn ein Stein gefunden wurde der mehr gegnereische Steine schlagen kann. Danach fügen wir diesen hinzu<br />
---&gt; geht ohne Leaks!</p>
<p>Sollte sich jetzt ein Stein finden, welcher gleich oft schlagen kann, wird dieser dem Vektor hinzugefügt ---&gt; geht korrekt und es gibt auch in weiterer Folge keine Probleme mit dem Programm, aber eben das Speicher-Leak. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /></p>
<p>Was ist der Grund? Bitte um Hilfe!</p>
<p>Liebe Grüße <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/2252935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252935</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Thu, 20 Sep 2012 08:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 08:59:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie ist der vector 'max_startpositions' bzw. die Variable 'helper' denn deklariert und wie werden diese erstellt (arbeitest du mit Zeigern)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252942</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 20 Sep 2012 08:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 09:00:34 GMT]]></title><description><![CDATA[<p>Auch wenn das jetzt dein Problem vermutlich nicht löst: schau dir doch mal an, was std::vector::clear() macht...</p>
<p>Interessant wäre auch, was &quot;helper&quot; genau ist. Mit einem kompilierfähigen Minimalbeispiel wirst du vermutlich schnell eine Lösung bekommen....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252945</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 20 Sep 2012 09:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 10:40:11 GMT]]></title><description><![CDATA[<p>hi!</p>
<p>danke mal für die Hilfe! das mit dem clear ist natürlich viel sauberer löst aber leider das problem nicht.</p>
<p>helper ist ein Integer. dieser wird in einer Schleife hochgezählt und wenn das if erfüllt ist. wird eben eine der beiden aktionen ausgeführt.<br />
es geht eben grundlegend darum herauszufinden an welcher position(helper) sich der Stein oder auch die Steine deshalb vector befinden welche am meisten figuren schlagen können.</p>
<p>max_startposition erstelle ich so:</p>
<pre><code class="language-cpp">std::vector &lt;int&gt; max_startpositions;
</code></pre>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252967</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Thu, 20 Sep 2012 10:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 11:31:34 GMT]]></title><description><![CDATA[<p>ich vermute, dein Problem liegt eigentlich ganz woanders, auch wenn es durch diese Zeilen ausgelöst wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252977</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 20 Sep 2012 11:31:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 11:48:00 GMT]]></title><description><![CDATA[<p>valgrind zeigt dir hier, wo der Speicher angefordert wird, den du verlierst, nicht, wo du ihn verlierst. Der Vektor ist in Ordnung, er wird nur nicht wieder aufgeräumt.</p>
<p>Wild geraten: Benutzt du exit() in deinem Programm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252983</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 20 Sep 2012 11:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 12:01:51 GMT]]></title><description><![CDATA[<p>Oer erstellst du den Vektor innerhalb eines Objektes, das du per new erzeugst und nicht aufräumst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252988</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 20 Sep 2012 12:01:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 12:09:46 GMT]]></title><description><![CDATA[<p>Dann wäre mehr als ein Block verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252991</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 20 Sep 2012 12:09:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 16:44:53 GMT]]></title><description><![CDATA[<p>ne exit benutze ich nicht. das eigenartige ist ja, dass es nur zu dem fehler kommnt, wenn ich einen zweiten eintrag im vektor hinzufüge also. wenn das if mit high_hit== count_hit aufgerufen wird. beim anderen if gibt es eben keine probleme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<p>undmit erzeuge ich auch nix innerhalb des vektors.</p>
<p>EDIT: im späteren verlauf des Programmes mache ich dies kommt ja einem exit gleich oder? aber darf dies zu jenem problem führen?</p>
<pre><code class="language-cpp">for(counter = 0; counter &lt; max_startpositions.size(); counter++)
      {

        if((return_value == HIT) &amp;&amp; (max_startpositions[counter] == startposition))
        {
          old_endposition = endposition;
          if(global_hit &gt; 1)
          {
            multiple_hits = true;
            global_hit--;
            return HIT_MORE;
          }
          multiple_hits = false;

          return HIT;
        }
</code></pre>
<p>naja ich habe jetzt max_startpositions.clear();</p>
<p>vor den returns eingefügt das problem ist noch immer da:/ obwohl jetzt ja eigentlich nix mehr im vektor stehen dürfte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253061</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Thu, 20 Sep 2012 16:44:53 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 17:52:00 GMT]]></title><description><![CDATA[<p>std::vector::clear gibt nicht zwingend den Speicher frei, bzw wird es bei den allermeisten Implementierungen nicht tun. Löschen kannst du ihn explizit so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; bla = { 1, 2, 3 };

{
    std::vector&lt;int&gt; foo;
    std::swap(foo, bla);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2253077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253077</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 20 Sep 2012 17:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 17:55:34 GMT]]></title><description><![CDATA[<p>Das geht schon wieder in Richtung Schnitzeljagd. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Irgendwo hantierst Du mit <code>new</code> und <code>delete</code> und Dir geht Speicher flöten, guck da!</p>
<p>Oder vielleicht hast Du irgendwo einen Destruktor, der nicht virtuell ist, in einer Basisklasse...</p>
<p>Ein <code>vector&lt;int&gt;</code> wird kaum ein Speicherleck haben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253079</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 20 Sep 2012 17:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 21:08:13 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>std::vector::clear gibt nicht zwingend den Speicher frei, bzw wird es bei den allermeisten Implementierungen nicht tun. Löschen kannst du ihn explizit so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; bla = { 1, 2, 3 };

{
    std::vector&lt;int&gt; foo;
    std::swap(foo, bla);
}
</code></pre>
</blockquote>
<p>genau das wars!</p>
<p>danke!!! <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/2253120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253120</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Thu, 20 Sep 2012 21:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Thu, 20 Sep 2012 21:32:50 GMT]]></title><description><![CDATA[<p>Oder kuerzer:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;().swap(bla);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2253123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253123</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 20 Sep 2012 21:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Fri, 21 Sep 2012 06:38:06 GMT]]></title><description><![CDATA[<p>nero08 schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>std::vector::clear gibt nicht zwingend den Speicher frei, bzw wird es bei den allermeisten Implementierungen nicht tun. Löschen kannst du ihn explizit so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; bla = { 1, 2, 3 };

{
    std::vector&lt;int&gt; foo;
    std::swap(foo, bla);
}
</code></pre>
</blockquote>
<p>genau das wars!</p>
<p>danke!!! <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>
</blockquote>
<p>Ich verstehe nicht, was das eine mit dem anderen zu tun hat.<br />
Das <code>vector</code> allozierten Speicher nicht wieder freigibt: geschenkt. Denn spätestens bei Programmende wird er das tun, es sei denn, man schafft es irgendwie seinen D'tor zu überspringen, z.B. mit dem beschriebenen <code>exit()</code> .</p>
<p>Ich kann gerade keine Versuche mit valgrind und <code>vector</code> anstellen, aber ich behaupte, dass <code>Clear-and-minimize/shrink_to_fit()</code> die Symptome und nicht die Ursachen beseitigt.</p>
<p>Eingebungen, Erläuterungen, Erklärungen für mich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253159</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 21 Sep 2012 06:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Fri, 21 Sep 2012 19:08:45 GMT]]></title><description><![CDATA[<p>Auch wenn ich hier ein Selbstgespräch führe:<br />
Was Du mit dem <code>swap()</code> machst, löst ein ganz anderes Problem!</p>
<p>Dein Programm ruft den D'tor von <code>startpositions</code> nicht auf, da liegt der Hund begraben.</p>
<p>Ist die Klasse <code>Man</code> vielleicht von irgendwas abgeleitet? <code>startposition</code> ist Member von <code>Man</code> , richtig?</p>
<p>Ich denke Du solltest dem noch auf den Grund gehen, wenn Du C++ lernst.</p>
<p>Hier mal ein Beispiel, was ich mir vorstellen könnte, was passiert. Es ist so geschrieben, dass der Trace Deinem sehr ähnlich ist.</p>
<p>Du kannst das Speicherleck beseitigen in dem Du eine der beiden markierten Zeilen A oder B hinzufügst.<br />
Aber während B die Symptome kaschiert, beseitigt A den Fehler!</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

struct Foo {
  virtual void clear_and_minimize() = 0;
  // virtual ~Foo() {}  // Zeile A
};

struct Bar : Foo{
  std::vector&lt;int&gt; v;
  Bar() { v.push_back(42); v.push_back(42); }
  void clear_and_minimize() { std::vector&lt;int&gt;().swap(v); }
};

int main(){
  Foo* f = new Bar;
  // f-&gt;clear_and_minimize(); // Zeile B
  delete f;
}
</code></pre>
<p>valgrind schrieb:</p>
<blockquote>
<p>==3483== HEAP SUMMARY:<br />
==3483== in use at exit: 8 bytes in 1 blocks<br />
==3483== total heap usage: 3 allocs, 2 frees, 44 bytes allocated<br />
==3483==<br />
==3483== 8 bytes in 1 blocks are definitely lost in loss record 1 of 1<br />
==3483== at 0x4C2A3D7: operator new(unsigned long) (vg_replace_malloc.c:287)<br />
==3483== by 0x4015F3: __gnu_cxx::new_allocator&lt;int&gt;::allocate(unsigned long, void const*) (in /tmp/test)<br />
==3483== by 0x401406: std::_Vector_base&lt;int, std::allocator&lt;int&gt; &gt;::_M_allocate(unsigned long) (in /tmp/test)<br />
==3483== by 0x400F50: std::vector&lt;int, std::allocator&lt;int&gt; &gt;::_M_insert_aux(__gnu_cxx::__normal_iterator&lt;int*, std::vector&lt;int, std::allocator&lt;int&gt; &gt; &gt;, int const&amp;) (in /tmp/test)<br />
==3483== by 0x400CA1: std::vector&lt;int, std::allocator&lt;int&gt; &gt;::push_back(int const&amp;) (in /tmp/test)<br />
==3483== by 0x400B25: Bar::Bar() (in /tmp/test)<br />
==3483== by 0x400A56: main (in /tmp/test)<br />
==3483==<br />
==3483== LEAK SUMMARY:<br />
==3483== definitely lost: 8 bytes in 1 blocks</p>
</blockquote>
<p>Ich hoffe Du schaust nochmal drauf.<br />
Allein schon, weil Du wahrscheinlich überall im code unnötige aufrufe von <code>swap()</code> hast... <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/2253387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253387</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 21 Sep 2012 19:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sat, 22 Sep 2012 20:06:32 GMT]]></title><description><![CDATA[<p>sorry für die späte Antowrt hatte in den letzten Tagen viel zu tun <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>ich versuche gerade zu verstehen, was du meisnt... liege ich richtig, dass du die Vermutung hast, dass ich den destruktor vergessen habe?</p>
<p>okay die klasse also man ist abgleleitet... der destruktor wird erzeugt, aber ist im moment leer. gehe ich richtig in der Vermutung, dass du meisnt ich soll swap() im Destruktor aufrufen?</p>
<p>aber ganz klar ist mir die situation immer noch nicht in der regel wird doch ein vector automatisch freigegeben?</p>
<p>danke jedenfalls für die nette Unterstützung <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/2253616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253616</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Sat, 22 Sep 2012 20:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sat, 22 Sep 2012 20:13:24 GMT]]></title><description><![CDATA[<p>Das wichtigste wäre erst einmal, den wahren Fehler zu finden. Das was du als Lösung beschrieben hast, kann nicht funktioniert haben. Zumindest nicht, wenn es in deinem Programm mit rechten Dingen zugeht (aber dann wäre der Fehler gar nicht erst aufgetreten). Daher mein Tipp: Du erzeugst irgendwo furchtbar undefiniertes Verhalten und es passiert einfach Unsinn <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="🙂"
    /> . Als du dann an anderer Stelle etwas geändert hast, passierte anderer Unsinn oder zwei Sorten Unsinn haben sich gegenseitig aufgehoben. Auf jeden Fall ist es nicht richtig, denn ein vector <em>kann</em> gar keinen Speicher lecken, so lange seine internen Strukturen intakt bleiben, wenn du damit ein Problem hattest, dann hast du es nun bloß vertuscht. Irgendetwas muss dir deinen vector an sich zerschießen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253618</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 22 Sep 2012 20:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sat, 22 Sep 2012 20:14:19 GMT]]></title><description><![CDATA[<p>Du musst den Destruktor in der Basisklasse virtuell machen, damit der richtige ausgeführt wird, wenn du ein Objekt einer Kindklasse durch einen Basisklassenzeiger löschst. Generell sollten polymorphe Basisklassen einen virtuellen Destruktor haben, um genau diese Problematik zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253619</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 22 Sep 2012 20:14:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sat, 22 Sep 2012 21:09:03 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>std::vector::clear gibt nicht zwingend den Speicher frei, bzw wird es bei den allermeisten Implementierungen nicht tun.</p>
</blockquote>
<p>Wenn es darum geht, den Speicher wieder frei zu geben, schlage ich vor, das mit Gültigkeitsbereichen zu regeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253620</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sat, 22 Sep 2012 21:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sun, 23 Sep 2012 16:33:39 GMT]]></title><description><![CDATA[<p>nero08 schrieb:</p>
<blockquote>
<p>liege ich richtig, dass du die Vermutung hast, dass ich den destruktor vergessen habe?</p>
</blockquote>
<p>Den Destruktor der Basisklasse, ja. Vergessen, oder nicht virtuell deklariert, siehe seldons Antwort.</p>
<p>nero08 schrieb:</p>
<blockquote>
<p>gehe ich richtig in der Vermutung, dass du meisnt ich soll swap() im Destruktor aufrufen?</p>
</blockquote>
<p>Nein. Die swaps schmeisst Du alle wieder raus. Es sei denn Dir geht der Speicher aus.</p>
<p>nero08 schrieb:</p>
<blockquote>
<p>aber ganz klar ist mir die situation immer noch nicht in der regel wird doch ein vector automatisch freigegeben?</p>
</blockquote>
<p>Das stimmt, deswegen ist der vector ja so bequem. Wenn das Objekt, dessen Member der vector ist zerstört wird, gibt der vector den allozierten Speicher frei und gut is'.<br />
Wird allerdings wie im Beispiel der D'tor von - in diesem Fall - <code>Bar</code> nicht aufgerufen, weil <code>~Foo()</code> nicht virtuell ist, wird auch der D'tor des vector nicht aufgerufen. Damit bleibt der Inhalt des vectors im Speicher erhalten und ist unerreichbar verloren.<br />
Mit dem <code>swap()</code> sorgst Du nun dafür, dass der vector dessen D'tor nicht aufgerufen wird, 0 Bytes alloziert, d.h. valgrind bekommt davon nix mit.</p>
<p>Allerdings ist das Fehlen eines virtuellem D'tor in einem Fall wie oben zusätzlich noch UB (s. C++ 5.3.5), müsste also auf jeden Fall gefixt werden.</p>
<p>Und obacht: dass das der Fehler ist, ist reine Spekulation!<br />
Aber <code>swap()</code> fixt keinen Fehler - siehe auch die Antwort von SeppJ.</p>
<p>Good Hunting! <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/2253771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253771</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sun, 23 Sep 2012 16:33:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher-Leak bei push_back on Sun, 23 Sep 2012 20:46:56 GMT]]></title><description><![CDATA[<p>ja da muss ich wohl nochmal DANKE sagen!</p>
<p>ich hatte wirklich in meiner Basisklasse keinen destruktor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>habe ihn jetzt hinzugefügt und die swaps gekickt - und keine leaks <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>allerding stellt sich mir hier ein kleines verständnisproblem vl. mag wer daraug eingehen <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>
<p>Also ich habe in meiner Unterklasse einen vector welcher alle gelöschten steine speichert. diesen brauche ich bei einem erneuten aufruf der klasse wieder für eine überprüfung also ob man einen zug machen darf.</p>
<p>wird nicht durch den aufruf des destruktors dieser vektor also auch der Inhalt gelöscht?</p>
<p>EDIT: den vektor muss ich schon noch passend entleeren, aber wenn ich mich noch an die vorherigen Beiträge erinnere muss ich dies mit swap mache oder reicht clear doch aus?<br />
also im Prinzip wird dann mittel destruktor der vektor im unterschied zu zuvor wirklich auch gelöscht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253838</guid><dc:creator><![CDATA[nero08]]></dc:creator><pubDate>Sun, 23 Sep 2012 20:46:56 GMT</pubDate></item></channel></rss>