<?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[v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier?]]></title><description><![CDATA[<p>Hallo!<br />
Was passiert hier?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

class obj {
private:
	int b;
public:
	obj(int b) {
		this-&gt;b=b;
	}
	int getb() {
		return b;
	}

	~obj() {
		std::cout &lt;&lt; &quot;destructor&quot; &lt;&lt; std::endl;
	}
};

int main() {
	std::vector&lt;obj&gt; v;
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(4)));
	v.push_back(*(new obj(6)));
	v.push_back(*(new obj(8)));
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(5)));

	for(unsigned int i=0; i &lt; v.size(); i++) {
		std::cout &lt;&lt; v[i].getb() &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Die Ausgabe lautet:</p>
<pre><code>destructor
destructor
destructor
destructor
destructor
destructor
destructor
2
4
6
8
2
5
destructor
destructor
destructor
destructor
destructor
destructor
</code></pre>
<p>1. Wieso werden die Objekte gleich wieder zerstört (Destruktor-Aufruf)?<br />
2. Wieso sind sie trotzdem ansprechbar?<br />
3. Wird der Speicher freigegeben (new, aber kein delete...Destruktor wird aber ja aufgerufen)?</p>
<p>Ich danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280346/v-push_back-new-obj-was-passiert-hier</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 04:04:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280346.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Jan 2011 22:25:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:25:04 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Was passiert hier?</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

class obj {
private:
	int b;
public:
	obj(int b) {
		this-&gt;b=b;
	}
	int getb() {
		return b;
	}

	~obj() {
		std::cout &lt;&lt; &quot;destructor&quot; &lt;&lt; std::endl;
	}
};

int main() {
	std::vector&lt;obj&gt; v;
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(4)));
	v.push_back(*(new obj(6)));
	v.push_back(*(new obj(8)));
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(5)));

	for(unsigned int i=0; i &lt; v.size(); i++) {
		std::cout &lt;&lt; v[i].getb() &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Die Ausgabe lautet:</p>
<pre><code>destructor
destructor
destructor
destructor
destructor
destructor
destructor
2
4
6
8
2
5
destructor
destructor
destructor
destructor
destructor
destructor
</code></pre>
<p>1. Wieso werden die Objekte gleich wieder zerstört (Destruktor-Aufruf)?<br />
2. Wieso sind sie trotzdem ansprechbar?<br />
3. Wird der Speicher freigegeben (new, aber kein delete...Destruktor wird aber ja aufgerufen)?</p>
<p>Ich danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006371</guid><dc:creator><![CDATA[Gnawr]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:27:47 GMT]]></title><description><![CDATA[<p>Was du da treibst, ist Schwachsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006373</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:37:55 GMT]]></title><description><![CDATA[<p>Die Zeile</p>
<pre><code class="language-cpp">v.push_back(*(new obj(2)));
</code></pre>
<p>ist eigentlich genau das Selbe wie</p>
<pre><code class="language-cpp">v.push_back(obj(2));
</code></pre>
<p>Es passiert folgendes<br />
1.<br />
Ein neues Objekt wird angelegt<br />
2.<br />
Die Funktion push_back wird mit diesem Objekt als Argument aufgerufen und da der Input-Parameter keine Referenz ist, wird es kopiert (CopyConstructor wird aufgerufen). Das ganze kannst du ja mal überprüfen, indem du für obj den Copy-Constructor überlädst.<br />
3.<br />
Das in 1. angelegte Objekt wird zerstört weil es den Scope verlässt und das von push_back kopierte Objekt wird gespeichert<br />
4.<br />
Dein Programm ist zu ende und der vector wird zerstört und damit auch alle gespeicherten Inhalte, d.h. ~vector wird aufgerufen, der für jedes element ~obj aufruft.</p>
<p>Hoffe das war verständlich.</p>
<p>Schönen Gruß</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006377</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:37:55 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:44:31 GMT]]></title><description><![CDATA[<p>Gnawr schrieb:</p>
<blockquote>
<p>Was passiert hier?</p>
</blockquote>
<p>new obj(2) alloziert auf dem Freispeicher ein neues Objekt.</p>
<p>Dann übergibst du dieses Objekt per Referenz an push_back. Dieses erzeugt über den Kopierkonstruktor eine Instanz von obj innerhalb des Vektors. Der von new erhaltene Zeiger geht verloren. Am Ende wird der Vektor mitsamt allen enthaltenen Objekten zerstört.<br />
Zwischendurch wird der Vektor ein paar mal vergrößert, dabei werden die Objekte umkopiert und natürlich auch zerstört.<br />
Gib dir mal noch den Konstruktor und den Kopierkonstruktor aus, dann wird es ein bisschen klarer.<br />
Ach ja, ich hab es nicht explizit erwähnt, aber du erzeugst natürlich Speicherlecks mit deinem new-ohne-delete.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006378</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:44:31 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:43:59 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Die Zeile</p>
<pre><code class="language-cpp">v.push_back(*(new obj(2)));
</code></pre>
<p>ist eigentlich genau das Selbe wie</p>
<pre><code class="language-cpp">v.push_back(obj(2));
</code></pre>
</blockquote>
<p>Eben nicht! Der Speicher wird zu Ende des Programms vom Betriebssystem weggeräumt, nicht von vector. Zeiger werden in Smartpointern gespeichert, und sonst normalerweise in gar nichts!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006379</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 22:44:10 GMT]]></title><description><![CDATA[<p>Gnawr schrieb:</p>
<blockquote>
<p>Was passiert hier?</p>
<pre><code class="language-cpp">std::vector&lt;obj&gt; v;
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(4)));
	v.push_back(*(new obj(6)));
	v.push_back(*(new obj(8)));
	v.push_back(*(new obj(2)));
	v.push_back(*(new obj(5)));

	for(unsigned int i=0; i &lt; v.size(); i++) {
		std::cout &lt;&lt; v[i].getb() &lt;&lt; std::endl;
	}
	return 0;
</code></pre>
<p>Die Ausgabe lautet:</p>
<pre><code>destructor
destructor
destructor
destructor
destructor
destructor
destructor
2
4
6
8
2
5
destructor
destructor
destructor
destructor
destructor
destructor
</code></pre>
<p>1. Wieso werden die Objekte gleich wieder zerstört (Destruktor-Aufruf)?</p>
</blockquote>
<p>Welche Objekte? Wenn Du die meinst, die Du im Freispeicher erzeugt hast, die hängen da immernoch (Speicherleck). Aber der Vektor vergrößert sich nach und nach und muss ggf Elemente in einen größeren Puffer umkopieren. Da werden dann auch welche zerstört. Du kannst das vielleicht besser nachvollziehen, wenn Du dem Kopierkonstruktor auch eine solche Ausgabe spendierst.</p>
<blockquote>
<p>2. Wieso sind sie trotzdem ansprechbar?</p>
</blockquote>
<p>Sind sie nicht. Das sind andere Objekte. Bau Dir mal einen sprechenden Kopierkonstruktor.</p>
<blockquote>
<p>3. Wird der Speicher freigegeben (new, aber kein delete...Destruktor wird aber ja aufgerufen)?</p>
</blockquote>
<p>Speicherleck. Und Du bist Schuld. :-p</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006380</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 13 Jan 2011 22:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Thu, 13 Jan 2011 23:15:08 GMT]]></title><description><![CDATA[<p>Ok Leute, danke...das hilft mir schon mal weiter!</p>
<p>Zum Sinn und Unsinn: Natürlich ging es mir bei diesem Beispiel nur darum, die Abläufe genauer nachzuvollziehen. Das dieser Code nicht wirklich sinnvoll ist, ist schon klar <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><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/2006386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006386</guid><dc:creator><![CDATA[Gnawr]]></dc:creator><pubDate>Thu, 13 Jan 2011 23:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Fri, 14 Jan 2011 00:36:20 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Zeiger werden in Smartpointern gespeichert, und sonst normalerweise in gar nichts!</p>
</blockquote>
<p>So ein Bullshit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006397</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 14 Jan 2011 00:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Fri, 14 Jan 2011 07:59:49 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Zeiger werden in Smartpointern gespeichert, und sonst normalerweise in gar nichts!</p>
</blockquote>
<p>So ein Bullshit.</p>
</blockquote>
<p>Du bist auch bullshit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006420</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 14 Jan 2011 07:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Fri, 14 Jan 2011 08:04:09 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>...So ein Bullshit.</p>
</blockquote>
<p>Du bist auch bullshit.</p>
</blockquote>
<p>Schau an: Jeder Mensch kann Scheiße produzieren.<br />
Welche Überraschung!</p>
<p>Gruß,</p>
<p>Simon2. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2006423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006423</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 14 Jan 2011 08:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to v.push_back(*(new obj)); &#x2F;&#x2F; was passiert hier? on Fri, 14 Jan 2011 09:01:42 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Zeiger werden in Smartpointern gespeichert, und sonst normalerweise in gar nichts!</p>
</blockquote>
<p>So ein Bullshit.</p>
</blockquote>
<p>Du bist auch bullshit.</p>
</blockquote>
<p>Auch wenn bullshit etwas hart ist - im Prinzip hat knivil Recht.<br />
Und da brauchen wir nicht auf dieses Niveau runterfallen...</p>
<p>Rohe Zeiger machen durchaus Sinn. Man muss nicht alles in Smartpointer packen. idR sind Smartpointer für besitzende Zeiger die beste Wahl, aber jede Regel hat Ausnahmen. Wenn man zB besitzende Zeiger in einen Container packen will und der Container soll die Objekte verwalten -&gt; boost::ptr_xxx und kein xxx&lt;shared_ptr&lt;&gt;&gt;.</p>
<p>Rohe Zeiger sind mit Vorsicht zu genießen, aber nicht zu verdammen <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/2006438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006438</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 14 Jan 2011 09:01:42 GMT</pubDate></item></channel></rss>