<?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[Ungewollter aufruf von Struct Destructor bei Kopieren in Vector]]></title><description><![CDATA[<p>Hallo<br />
mir ist nicht klar warum der Struct Destructor bei push_back aufgerufen wird.<br />
Was mache ich falsch ?</p>
<p>[cpp]</p>
<pre><code>struct sTest_t
{
 sTest_t()
 {
   pfDat = static_cast&lt;float*&gt;( malloc(100*sizeof(float)) );
 }
 ~sTest_t()
 {
  free(pfDat)
 }
 float *pfDat;
};

void main(void)
{
 std::vector&lt;sTest_t&gt; vTest;

 for( int iPtr =0; iPtr &lt; 3; iPtr++
  vTest.push_back(*(new sTest_t));

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/286559/ungewollter-aufruf-von-struct-destructor-bei-kopieren-in-vector</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 21:31:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286559.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 May 2011 07:20:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 07:20:00 GMT]]></title><description><![CDATA[<p>Hallo<br />
mir ist nicht klar warum der Struct Destructor bei push_back aufgerufen wird.<br />
Was mache ich falsch ?</p>
<p>[cpp]</p>
<pre><code>struct sTest_t
{
 sTest_t()
 {
   pfDat = static_cast&lt;float*&gt;( malloc(100*sizeof(float)) );
 }
 ~sTest_t()
 {
  free(pfDat)
 }
 float *pfDat;
};

void main(void)
{
 std::vector&lt;sTest_t&gt; vTest;

 for( int iPtr =0; iPtr &lt; 3; iPtr++
  vTest.push_back(*(new sTest_t));

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2062052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062052</guid><dc:creator><![CDATA[Maximizer]]></dc:creator><pubDate>Thu, 12 May 2011 07:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 07:27:21 GMT]]></title><description><![CDATA[<p>Objekte werden in den vector kopiert, d.h. du möchtest entweder:</p>
<pre><code class="language-cpp">vec.push_back(sTest_t()); // Objekt am Stack anlegen und in den vec kopieren, nach der Kopie (Copy-Constructor fehlt bei dir! Bitte Rule of three beachten!) wird hier auch der Destructor des außen liegenden Objekts aufgerufen
</code></pre>
<p>Oder du speicherst dir den Zeiger:</p>
<pre><code class="language-cpp">vector&lt;sTest_t*&gt; ptrvec;
ptrvec.push_back(new sTest_t());

...

for(...)
    delete ptrvec[i]; // zu jedem new gibts ein delete (fehlt bei dir oben auch)
</code></pre>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062057</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Thu, 12 May 2011 07:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 07:40:25 GMT]]></title><description><![CDATA[<p>Ich erzeuge die Struct doch bereits mit dem Operator new<br />
und damit liegt sie doch im Heap weswegen bei dem push_back der Destructor<br />
nicht ausgeführt werden dürfte weil das Objekt doch im Heap weiterlebt.<br />
Komischerweise wir der Destructor auch nur beim Letzten Schleifendurchgang aufgerufen.</p>
<p>Was ich nicht machen möchte ist das Speichern von Zeigern auf die Struct.<br />
Wie müsste so ein Copy Constructor des Vectors aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062063</guid><dc:creator><![CDATA[Maximizer]]></dc:creator><pubDate>Thu, 12 May 2011 07:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 07:44:59 GMT]]></title><description><![CDATA[<p>Mal etwas überarbeitet:</p>
<pre><code class="language-cpp">struct sTest_t
{
    sTest_t() : data(100)
    { }
    std::vector&lt;float&gt; data; //wozu das gehampel mit malloc?
};

int main( ) //void main(...) ist nicht standardkonform
{
    std::vector&lt;sTest_t&gt; vTest;

    for( int i = 0; i &lt; 3; ++i)
    {
        vTest.push_back((sTest_t())); //nichts mehr mit new. speicher wird automatisch freigegeben
    }    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2062064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062064</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 12 May 2011 07:44:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 08:14:48 GMT]]></title><description><![CDATA[<p>Maximizer schrieb:</p>
<blockquote>
<p>Hallo<br />
mir ist nicht klar warum der Struct Destructor bei push_back aufgerufen wird.<br />
Was mache ich falsch ?</p>
<p>[cpp]</p>
<pre><code>struct sTest_t
{
 sTest_t()
 {
   pfDat = static_cast&lt;float*&gt;( malloc(100*sizeof(float)) );
 }
 ~sTest_t()
 {
  free(pfDat)
 }
 float *pfDat;
};

void main(void)
{
 std::vector&lt;sTest_t&gt; vTest;

 for( int iPtr =0; iPtr &lt; 3; iPtr++
  vTest.push_back(*(new sTest_t)); &lt;&lt; Bäm!

}
</code></pre>
</blockquote>
<p>Du dereferenzierst den Zeiger bei der Übergabe an die push_back Methode, damit verlierst du die Information, dass es sich um einen Zeiger handelt. Du machst gerade so ziemlich alles falsch, was man falsch machen kann.</p>
<ol>
<li>Du erzeugst ein Speicherleck, weil du nicht die Zeiger im Vektor ablegst und hinterher wieder löschst, sondern du erzeugst ein anonymes Objekt auf dem Heap, dessen Kopie im Vektor abgelegt wird.</li>
<li>Da der korrekte Zuweisungsoperator fehlt erzeugst du in den Objekten im Vektor dangling Pointers, denn durch den fehlenden Zuweisungsoperator wird der pfDat Zeiger einfach kopiert. Wenn der Vektor reallokieren muss erzeugt er temporäre Kopien von Objekten, die bei ihrer Zerstörung pfDat wieder freigeben. Da aber der nur rohe Zeiger kopiert wurde zeigt der pfDat Zeiger der erstellten Kopien in´s Nirvana.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2062071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062071</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 12 May 2011 08:14:48 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter aufruf von Struct Destructor bei Kopieren in Vector on Thu, 12 May 2011 08:43:09 GMT]]></title><description><![CDATA[<ol start="3">
<li>Copy-Konstruktor fehlt ebenso</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2062087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062087</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 12 May 2011 08:43:09 GMT</pubDate></item></channel></rss>