<?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[Löscht Vector Instazen meiner Klasse?]]></title><description><![CDATA[<p>Die Frage ist, ob der Destructor eines Vektors auch die Instanzen der beinhalteten Klasse löscht, wie es hier passieren sollte und ob es einen besseren/stilvolleren Weg gibt um das gewünschte Ergebnis zu erzielen. Ich wollte dabei die Verwendung von Pointern vermeiden, um am Ende möglichst wenige Segfaults zu bekommen :p</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main()
{
	std::vector&lt;A&gt; v;
	{
		A &amp;a = *(new A);
		v.push_back(a);
	}
} //Wurde a hier gelöscht?
</code></pre>
<p>Vielen Dank schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307233/löscht-vector-instazen-meiner-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 20:50:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307233.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Aug 2012 17:52:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Mon, 20 Aug 2012 17:52:38 GMT]]></title><description><![CDATA[<p>Die Frage ist, ob der Destructor eines Vektors auch die Instanzen der beinhalteten Klasse löscht, wie es hier passieren sollte und ob es einen besseren/stilvolleren Weg gibt um das gewünschte Ergebnis zu erzielen. Ich wollte dabei die Verwendung von Pointern vermeiden, um am Ende möglichst wenige Segfaults zu bekommen :p</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main()
{
	std::vector&lt;A&gt; v;
	{
		A &amp;a = *(new A);
		v.push_back(a);
	}
} //Wurde a hier gelöscht?
</code></pre>
<p>Vielen Dank schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243810</guid><dc:creator><![CDATA[Encypruon]]></dc:creator><pubDate>Mon, 20 Aug 2012 17:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Tue, 21 Aug 2012 20:28:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Frage ist, ob der Destructor eines Vektors auch die Instanzen der beinhalteten Klasse löscht,</p>
</blockquote>
<p><s>Ja. Aber</s> Die Frage bei deinem Code ist, was sonst noch passiert.</p>
<p><strong>Edit:</strong><br />
Hier noch genauer erläutert, dein Code ein wenig umgeschrieben:</p>
<pre><code class="language-cpp">#include &lt;vector&gt; 

class A {}; 

int main() 
{ 
    std::vector&lt;A&gt; v; 
    { 
        A* p = new A;    // Objekt vom Typ A auf den Freestore erzeugen, p zeigt darauf.
        A &amp;a = *p;       // Referenz auf das zuvor erzeugte Objekt initialisieren, noch wurde nichts kopiert oder gelöscht...
        v.push_back(a);  // Objekt Referenz wird an std::vector&lt;A&gt;::push_back(..) übergeben und dabei kopiert
    } // Die Referenz a wird ungültig, der Pointer p wird ungültig, das Objekt auf das p zeigte lebt weiter und kann nicht mehr erreicht werden. Es entsteht ein Memory Leak
} // Das Objekt v wird zerstört und damit die Kopie worauf a und p einmal zeigten
</code></pre>
<p><strong>Edit2:</strong> Die Kommentare beziehen sich auf das veraltete C++03</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243811</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 21 Aug 2012 20:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Mon, 20 Aug 2012 18:42:36 GMT]]></title><description><![CDATA[<p>Danke, die Frage an sich ist damit für mich beantwortet, auch wenn ich mit &quot;ist a hier gelöscht&quot; das Objekt und nicht die Referenz meinte. Da du sagst, dass sich die Kommentare auf C++03 beziehen, würde mich jetzt interessieren, worin dabei der Unterschied zu C++11 besteht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243820</guid><dc:creator><![CDATA[Encypruon]]></dc:creator><pubDate>Mon, 20 Aug 2012 18:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Mon, 20 Aug 2012 19:13:25 GMT]]></title><description><![CDATA[<p>Wenn ich es mir genau überlege besteht keinen Unterschied zu C++11. Im Hinterkopf hatte ich noch die Move Geschichte, welche hier aber nicht zum tragen kommt, da ein L-Value an push_back(..) übergeben wird.</p>
<p>Wie auch immer, ich hoffe dir ist klar, dass dein Code so nicht gut ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243825</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 20 Aug 2012 19:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Mon, 20 Aug 2012 19:52:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29285">@Encypruon</a><br />
Das Objekt wird nicht gelöscht, da im Vektor ja eine Kopie gespeichert wird. Die Kopie wird gelöscht, das ursprüngliche Objekt nicht. -&gt; Leak</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243842</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 20 Aug 2012 19:52:46 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Tue, 21 Aug 2012 08:37:40 GMT]]></title><description><![CDATA[<p>Encypruon schrieb:</p>
<blockquote>
<p>Die Frage ist, ob der Destructor eines Vektors auch die Instanzen der beinhalteten Klasse löscht,</p>
</blockquote>
<p>Ja klar. Aber du hast da trotzdem etwas missverstanden. Siehe unten.</p>
<p>Encypruon schrieb:</p>
<blockquote>
<p>wie es hier passieren sollte und ob es einen besseren/stilvolleren Weg gibt um das gewünschte Ergebnis zu erzielen. Ich wollte dabei die Verwendung von Pointern vermeiden, um am Ende möglichst wenige Segfaults zu bekommen :p</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main()
{
	std::vector&lt;A&gt; v;
	{
		A &amp;a = *(new A);
		v.push_back(a);
	}
} //Wurde a hier gelöscht?
</code></pre>
<p>Vielen Dank schon mal im Voraus.</p>
</blockquote>
<p>Du hast hier ein Speicherleck. Das Objekt, auf das sich a bezieht, hast du im Freispeicher angelegt und bleibt da bis zum Programmende einfach hängen. Der Vektor speichert nicht eine Referenz auf dieses Objekt und gibt es hinterher frei, sondern er erzeugt eine Kopie des Objekts und gibt diese Kopie wieder frei. Um dein im Freispeicher erzeugtes Objekt musst du dich selbst kümmern. Dieses Programm ergibt relativ wenig Sinn. Ohne Speicherleck sieht es dann so aus:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main()
{
	{
		std::vector&lt;A&gt; v;
		A a;
		v.push_back(a);
	}
	// hier gibt's kein A-Objekt mehr
}
</code></pre>
<p>Mir fallen eigentlich nur zwei Klassen aus der neuen Standardbibliothek ein, die sich so verhalten, wie du es von vector erwartet hattest -- also in dem Sinne, dass sie sich für das von dir allozierte Zeug &quot;verantwortlich fühlen&quot; und es für dich irgendwann freigeben: std::shared_ptr und std::unique_ptr. Alles andere ist &quot;wertorientiert&quot;.</p>
<p>Ggf. macht auch sowas Sinn:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main()
{
	{
		std::vector&lt;std::unique_ptr&lt;A&gt;&gt; v;
		std::unique_ptr&lt;A&gt; up (new A);
		v.push_back(std::move(a));
	}
	// hier gibt's kein A-Objekt mehr
}
</code></pre>
<p>Das ist aber wahrscheinlich weniger praktisch, als du denkst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2243972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2243972</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 21 Aug 2012 08:37:40 GMT</pubDate></item><item><title><![CDATA[Reply to Löscht Vector Instazen meiner Klasse? on Tue, 21 Aug 2012 20:14:31 GMT]]></title><description><![CDATA[<p>Ich habs wohl nicht klar genug geschrieben... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2244243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2244243</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 21 Aug 2012 20:14:31 GMT</pubDate></item></channel></rss>