<?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[Speicherfreigabe von Klasse und ihren Membern.]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe nur zwei Verständnis-fragen zur Speicherfreigabe von Klasse und ihren Membern.</p>
<p>1.) Wenn ich eine Klasse schreibe die als Member einige Pointer auf Objekt hat. Werden die Objekte nach dem löschen meiner Klasse auf implizit gelöscht oder muss ich diese explizit im Dekonstruktor mit delete machen?</p>
<p>2.) Wie schaut der gleiche Fall wie (1) aus mit einem Member vom Type std::vector&lt;Irgendwas*&gt; myVectorMember</p>
<p>Würde mich über eine kurz oder gerne auch Ausführliche Antwort freuen.</p>
<p>Grüße, free</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306317/speicherfreigabe-von-klasse-und-ihren-membern</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 06:28:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306317.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jul 2012 21:11:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Tue, 24 Jul 2012 21:11:19 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich habe nur zwei Verständnis-fragen zur Speicherfreigabe von Klasse und ihren Membern.</p>
<p>1.) Wenn ich eine Klasse schreibe die als Member einige Pointer auf Objekt hat. Werden die Objekte nach dem löschen meiner Klasse auf implizit gelöscht oder muss ich diese explizit im Dekonstruktor mit delete machen?</p>
<p>2.) Wie schaut der gleiche Fall wie (1) aus mit einem Member vom Type std::vector&lt;Irgendwas*&gt; myVectorMember</p>
<p>Würde mich über eine kurz oder gerne auch Ausführliche Antwort freuen.</p>
<p>Grüße, free</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235391</guid><dc:creator><![CDATA[free]]></dc:creator><pubDate>Tue, 24 Jul 2012 21:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Tue, 24 Jul 2012 21:18:23 GMT]]></title><description><![CDATA[<p>wenn du nur einen Zeiger auf der Objekt hast, wird er gelöscht wenn die Klasse den Destructor aufruft. Anderst ist es bei new !!!</p>
<p>Solltest du mit dynamischen Speicher arbeiten, musst du ihn selbst wieder frei geben(mit delete).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235393</guid><dc:creator><![CDATA[ratapatta]]></dc:creator><pubDate>Tue, 24 Jul 2012 21:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Tue, 24 Jul 2012 21:35:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Foo
{
	int * a;
	int * b;
	int c;
	std::vector&lt;int&gt; vec1;
	std::vector&lt;int*&gt; vec2;

	Foo()
	: a(nullptr), b(new int(5)), c(10),
	  vec1(100, -1), vec2(100, new int(100)) 
	{ }

	~Foo()
	{
		// a muss nicht gelöscht werden, da es ja nie initialisert wurde, in diesem konkreten fall
		delete b; // da für b per new speicher allokiert wurde
		// c muss nicht angefasst werden, da automatische destruktion

		// vec1 kümmert sich um alles selbst

		// vec2 kümmert sich um die internen zeiger selbst, wie 
		// vec1, aber nicht um das was hitner den zeigern steht
		// daher:
		for(auto it = vec2.begin(); it != vec2.end(); ++it)
			delete *it;
		// oder
		for(size_t i = 0; i &lt; vec2.size(); ++i)
			delete vec2[i];
	}
};
</code></pre>
<p>hoffe, das wird so klarer.<br />
du musst dich um rohe zeiger selbst kümmern, um jegliche verwaltungen. du kannst das zwar an automatische funktionen wie kon- oder destruktoren abgeben, aber dort musst du es dann auch schreiben. besser sind smart pointer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235396</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 24 Jul 2012 21:35:35 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Tue, 24 Jul 2012 22:16:53 GMT]]></title><description><![CDATA[<p>free schrieb:</p>
<blockquote>
<p>1.) Wenn ich eine Klasse schreibe die als Member einige Pointer auf Objekt hat. Werden die Objekte nach dem löschen meiner Klasse auf implizit gelöscht oder muss ich diese explizit im Dekonstruktor mit delete machen?</p>
</blockquote>
<p>Ja, werden sie mit <code>unique_ptr</code> . In C++ gibt man so gut wie nie explizit Speicher frei. Das erledigen stets RAII-Helfer wie <code>vector</code> , <code>shared_ptr</code> oder eben <code>unique_ptr</code> .</p>
<p>free schrieb:</p>
<blockquote>
<p>2.) Wie schaut der gleiche Fall wie (1) aus mit einem Member vom Type std::vector&lt;Irgendwas*&gt; myVectorMember</p>
</blockquote>
<p>Du meinst <code>vector&lt;unique_ptr&lt;Irgendwas&gt;&gt;</code> ? Da muss man im Gegensatz zum rohen Zeiger nur beachten, dass <code>unique_ptr</code> movable, aber nicht kopierbar ist. Das Stichwort lautet Rvalue-Referenz.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Foo
{
	int * a;
	int * b;
	int c;
	std::vector&lt;int&gt; vec1;
	std::vector&lt;int*&gt; vec2;
	
	Foo()
	: a(nullptr), b(new int(5)), c(10),
	  vec1(100, -1), vec2(100, new int(100)) 
	{ }
	
	~Foo()
	{
		// a muss nicht gelöscht werden, da es ja nie initialisert wurde, in diesem konkreten fall
		delete b; // da für b per new speicher allokiert wurde
		// c muss nicht angefasst werden, da automatische destruktion
		
		// vec1 kümmert sich um alles selbst
		
		// vec2 kümmert sich um die internen zeiger selbst, wie 
		// vec1, aber nicht um das was hitner den zeigern steht
		// daher:
		for(auto it = vec2.begin(); it != vec2.end(); ++it)
			delete *it;
		// oder
		for(size_t i = 0; i &lt; vec2.size(); ++i)
			delete vec2[i];
	}
};
</code></pre>
</blockquote>
<p>Der Konstruktor ist fehlerhaft, weil er nicht ausnahmesicher ist.<br />
<code>vec2(100, new int(100))</code> ist Blödsinn und erzeugt undefiniertes Verhalten im Destruktor.</p>
<p>In (richtigem) C++ sähe das Beispiel so aus:</p>
<pre><code class="language-cpp">class Foo
{
	std::unique_ptr&lt;int&gt; a;
	std::unique_ptr&lt;int&gt; b;
	int c;
	std::vector&lt;int&gt; vec1;
	std::vector&lt;std::unique_ptr&lt;int&gt;&gt; vec2;

	Foo()
	: b(new int(5)), c(10),
	  vec1(100, -1), vec2(100) 
	{
		//Falsch: vec2(100, new int(100)) 
		//Richtig:
		std::generate(begin(vec2), end(vec2), []()
		{
			return std::unique_ptr&lt;int&gt;(new int(0));
		});
	}
}
</code></pre>
<p>Jawohl, kein Destruktor. Den implementiert man in C++ fast nie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235407</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 24 Jul 2012 22:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 08:34:56 GMT]]></title><description><![CDATA[<p>Man sollte noch dazu sagen, dass ein Zeigermember auf ein einzelnes, nicht-polymorphes Objekt(hier int), welches im Konstruktor mit new von der Klasse selber erzeugt wird, ebenfalls Unsinn ist und nur in Beispiele, niemals in echten Code, gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235465</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 Jul 2012 08:34:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 09:21:42 GMT]]></title><description><![CDATA[<p>dafür ists ja ein beispiel <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>TyRoXx schrieb:</p>
<blockquote>
<p>Der Konstruktor ist fehlerhaft, weil er nicht ausnahmesicher ist.</p>
</blockquote>
<p>naja ausnahmesicherheiten gehen ja etwas weiter schon, es ging ja erstmal nur ums prinzip von zeigern und deren zuständigkeiten</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p><code>vec2(100, new int(100))</code> ist Blödsinn und erzeugt undefiniertes Verhalten im Destruktor.</p>
</blockquote>
<p>ok, jetzt muss ich mal überlegen: du meinst, weil der returnwert von new an den construktor von vector übergeben wird, und der diesen einfach stupide weiter in jedes element (also in jeden gespeicherten zeiger) schiebt?</p>
<p>halt stop, ich sehe gerade der vector erwartet dort eine referenz. das heisst, er arbeitet mit einer referenz auf die temporäre variable (die ja der rückgabe wert von new ist) und schiebt diese in seine elemente rein. ja das hört sich schon schräg an...</p>
<p>kommt das so etwa hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235486</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 25 Jul 2012 09:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 10:35:20 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>dafür ists ja ein beispiel <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>TyRoXx schrieb:</p>
<blockquote>
<p>Der Konstruktor ist fehlerhaft, weil er nicht ausnahmesicher ist.</p>
</blockquote>
<p>naja ausnahmesicherheiten gehen ja etwas weiter schon, es ging ja erstmal nur ums prinzip von zeigern und deren zuständigkeiten</p>
</blockquote>
<p>Das ist aber ein wichtiger, unabtrennbarer Teil des Themas und man sollte es gleich richtig machen. Je mehr du es dir falsch angewöhnst, desto schwieriger wirst du diese Angewohnheit später wieder los.</p>
<blockquote>
<p>TyRoXx schrieb:</p>
<blockquote>
<p><code>vec2(100, new int(100))</code> ist Blödsinn und erzeugt undefiniertes Verhalten im Destruktor.</p>
</blockquote>
<p>ok, jetzt muss ich mal überlegen: du meinst, weil der returnwert von new an den construktor von vector übergeben wird, und der diesen einfach stupide weiter in jedes element (also in jeden gespeicherten zeiger) schiebt?</p>
<p>halt stop, ich sehe gerade der vector erwartet dort eine referenz. das heisst, er arbeitet mit einer referenz auf die temporäre variable (die ja der rückgabe wert von new ist) und schiebt diese in seine elemente rein. ja das hört sich schon schräg an...</p>
<p>kommt das so etwa hin?</p>
</blockquote>
<p>Nein. Was hier passiert ist, dass nicht 100 neue ints mit Wert 100 erzeugt werden, sondern es wird ein int mit Wert 100 erzeugt, und dann 100 Kopien des Zeigers darauf gespeichert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235506</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 Jul 2012 10:35:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 10:37:35 GMT]]></title><description><![CDATA[<p>ja genau das meine ich. das ist ja der rückgabewert von new</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235507</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 25 Jul 2012 10:37:35 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 11:14:04 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>ja genau das meine ich. das ist ja der rückgabewert von new</p>
</blockquote>
<p>In deinem ersten Satz. Jedoch:</p>
<blockquote>
<p>halt stop, ich sehe gerade der vector erwartet dort eine referenz. das heisst, er arbeitet mit einer referenz auf die temporäre variable (die ja der rückgabe wert von new ist) und schiebt diese in seine elemente rein. ja das hört sich schon schräg an...</p>
</blockquote>
<p>Das ist überhaupt nicht schräg, sondern der Normalfall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235516</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 Jul 2012 11:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 12:57:59 GMT]]></title><description><![CDATA[<p>das mit der referenz? ja das schon.</p>
<p>aber eine referenz auf einen zeiger der auch noch temporär ist?<br />
das hört sich in meinen augen schon komisch an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235543</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 25 Jul 2012 12:57:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 13:04:06 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>aber eine referenz auf einen zeiger der auch noch temporär ist?<br />
das hört sich in meinen augen schon komisch an...</p>
</blockquote>
<p><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=":confused:"
      alt="😕"
    /> Wieso?</p>
<pre><code class="language-cpp">void foo(const std::string &amp;str)
{
 std::cout &lt;&lt; str;
}

int main()
{
 foo(&quot;Hello World!\n&quot;);
}
</code></pre>
<p>Referenz auf temporäres Objekt. So normal, du hast es vermutlich noch nie bemerkt. Ob das temporäre Objekt nun ein Zeiger ist oder hier ein String (der im Prinzip auch nur ein verkappter Zeiger auf char ist), ist doch egal. Zeiger sind auch Objekte wie alle anderen auch.</p>
<p>Du darfst auch gerne Kopien von dem Objekt machen, im Prinzip macht der Code hier ja schon eine Kopie auf dem Bildschirm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235545</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 Jul 2012 13:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 13:08:40 GMT]]></title><description><![CDATA[<p>ok, du hast mich überzeugt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235549</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 25 Jul 2012 13:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherfreigabe von Klasse und ihren Membern. on Wed, 25 Jul 2012 13:15:45 GMT]]></title><description><![CDATA[<p>jetzt wo ich darüber nachdenke:</p>
<pre><code class="language-cpp">vector&lt;string&gt; vec;
vec.push_back(&quot;foo&quot;);
</code></pre>
<p>Hier muss innerhalb von push_back auf jeden Fall nochmal kopiert (statt gemoved) werden, da dem const T&amp;-Parameter ja nicht zu entnehmen ist, of da ein temporäres Objekt gebunden wurde. Hier besteht noch Korrekturpotential.<br />
Man bräucht vermutlich noch eine weitere Überladung</p>
<pre><code class="language-cpp">template &lt;typename U&gt;
void push_back(U&amp;&amp; x) { push_back(implicit_cast&lt;T&gt;(std::forward&lt;U&gt;(x))); }
</code></pre>
<p>Das Problem bestand im ursprünglichen rvalue-Proposal nicht, als rvalue-Referenzen noch temporäre Objekte erzeugen konnten. Man kann nat. auch auf emplace_back ausweichen, das scheint mir aber in diesem Fall eine unnatürliche Krücke zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235552</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 25 Jul 2012 13:15:45 GMT</pubDate></item></channel></rss>