<?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[new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage]]></title><description><![CDATA[<p>Guten Morgen :),</p>
<p>in dem Buch &quot;C++ Primer&quot; bin ich beim bewältigen der einzelnen Übungsaufgaben auf eine Sache gestoßen, bei der ich wohl etwas klärungsbedarf habe. Hier mal ein, auf die wichtigsten Bestandtteile gekürzter, Beispielcode:</p>
<pre><code class="language-cpp">class Checkoutrecord {
public:
	typedef std::vector&lt; std::pair&lt;std::string, std::string&gt;* &gt; w_list;
	void add_wlist(const std::string&amp;, const std::string&amp;);
    ~Checkoutrecord();	
    /* ... */
private:
	std::vector&lt; std::pair&lt;std::string, std::string&gt;* &gt; wait_list;
    /* ... */
};

// Fügt Name eines Kunden zur &quot;Warteliste&quot; hinzu
void Checkoutrecord::add_wlist(const std::string &amp;first, const std::string &amp;second)
{
	wait_list.push_back(new std::pair&lt;std::string, std::string&gt;(std::make_pair(first, second)));
	return;
}

// Destruktor
Checkoutrecord::~Checkoutrecord()
{
	w_list::size_type i = 0;
	while (i != wait_list.size())
		delete wait_list[i++];
}
</code></pre>
<p>Im Buch vorgegeben war das Datenelement <code>wait_list</code> , der Rest ist von mir. Aber es geht mir nicht so sehr um die Aufgabe in dem Buch, sondern mich interessiert viel mehr was im Destruktor der Klasse passiert.</p>
<pre><code class="language-cpp">Checkoutrecord::~Checkoutrecord()
{
	w_list::size_type i = 0;
	while (i != wait_list.size())
		delete wait_list[i++];
}
</code></pre>
<p>Ich bin beim Schreiben des Destruktors davon ausgegangen, dass durch das Freigeben des Speichers mit <code>delete</code> auch die entsprechenden Elemente des Vektors <code>wait_list</code> mitgelöscht werden, aber stimmt das denn überhaupt? Oder habe ich nach dem Aufruf des Destruktors nur einen Vektor dessen Elemente ungültige Zeiger sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227118/new-und-delete-bei-vector-lt-object-gt-kurze-frage</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227118.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Nov 2008 09:41:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage on Tue, 11 Nov 2008 09:41:11 GMT]]></title><description><![CDATA[<p>Guten Morgen :),</p>
<p>in dem Buch &quot;C++ Primer&quot; bin ich beim bewältigen der einzelnen Übungsaufgaben auf eine Sache gestoßen, bei der ich wohl etwas klärungsbedarf habe. Hier mal ein, auf die wichtigsten Bestandtteile gekürzter, Beispielcode:</p>
<pre><code class="language-cpp">class Checkoutrecord {
public:
	typedef std::vector&lt; std::pair&lt;std::string, std::string&gt;* &gt; w_list;
	void add_wlist(const std::string&amp;, const std::string&amp;);
    ~Checkoutrecord();	
    /* ... */
private:
	std::vector&lt; std::pair&lt;std::string, std::string&gt;* &gt; wait_list;
    /* ... */
};

// Fügt Name eines Kunden zur &quot;Warteliste&quot; hinzu
void Checkoutrecord::add_wlist(const std::string &amp;first, const std::string &amp;second)
{
	wait_list.push_back(new std::pair&lt;std::string, std::string&gt;(std::make_pair(first, second)));
	return;
}

// Destruktor
Checkoutrecord::~Checkoutrecord()
{
	w_list::size_type i = 0;
	while (i != wait_list.size())
		delete wait_list[i++];
}
</code></pre>
<p>Im Buch vorgegeben war das Datenelement <code>wait_list</code> , der Rest ist von mir. Aber es geht mir nicht so sehr um die Aufgabe in dem Buch, sondern mich interessiert viel mehr was im Destruktor der Klasse passiert.</p>
<pre><code class="language-cpp">Checkoutrecord::~Checkoutrecord()
{
	w_list::size_type i = 0;
	while (i != wait_list.size())
		delete wait_list[i++];
}
</code></pre>
<p>Ich bin beim Schreiben des Destruktors davon ausgegangen, dass durch das Freigeben des Speichers mit <code>delete</code> auch die entsprechenden Elemente des Vektors <code>wait_list</code> mitgelöscht werden, aber stimmt das denn überhaupt? Oder habe ich nach dem Aufruf des Destruktors nur einen Vektor dessen Elemente ungültige Zeiger sind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613054</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage on Tue, 11 Nov 2008 09:50:34 GMT]]></title><description><![CDATA[<p>dein Vector</p>
<pre><code class="language-cpp">std::vector&lt; std::pair&lt;std::string, std::string&gt;* &gt; wait_list;
</code></pre>
<p>enhält ja zeiger auf objecte des typs</p>
<pre><code class="language-cpp">std::pair&lt;std::string, std::string&gt;
</code></pre>
<p>hier erzeugst du ein objekt des typs mit new und merkst dir diese allokierten speicher über den pointer welchen du im vector speichert.</p>
<pre><code class="language-cpp">wait_list.push_back(new std::pair&lt;std::string, std::string&gt;(std::make_pair(first, second)));
</code></pre>
<p>im destruktor werden alle Elemente (pointer) deines vector durchlaufen, und alle speicehrbereich auf die die pointer zeigen mit delete gelöscht</p>
<pre><code class="language-cpp">w_list::size_type i = 0;
    while (i != wait_list.size())
        delete wait_list[i++];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1613068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613068</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage on Tue, 11 Nov 2008 09:53:56 GMT]]></title><description><![CDATA[<p>Das heißt das du nach dem Aufruf des Destruktor bzw nach Aufruf der Schleife da drin eine wait_list voller ungültiger Pointer hast. Was aber ja kein Problem ist, da das Objekt dann eh gelöscht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613072</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage on Tue, 11 Nov 2008 09:58:12 GMT]]></title><description><![CDATA[<p>Und nun.... die Antwort auf die Frage:</p>
<p>Am Ende des Destruktors hast Du tatsächlich einen Vector mit lauter ungültigen Zeigern. Das ist aber nicht tragisch, da dieser Vector <strong>nach</strong> Ablauf des Destruktors sowieso freigegeben wird, da der Destruktor ja gerade das Objekt freigibt, welches den Vector enthält. Und ein Vector gibt bei seiner Freigabe auch immer alle seine Elemente frei (Achtung: Nicht jedoch das, worauf seine Elemente zeigen, wenn es denn Zeiger sind, aber das machst Du ja selbst).</p>
<p>(EDIT: Bei Erstellung des Eingangssatzes war das Posting von Fellhuhn noch nicht sichtbar)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613075</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete bei vector&amp;lt;object*&amp;gt; - kurze Frage on Tue, 11 Nov 2008 10:07:21 GMT]]></title><description><![CDATA[<p>Hui, die Antworten kamen aber echt schnell und haben mich zudem vollends aufgeklärt. Vielen Dank an alle :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613087</guid><dc:creator><![CDATA[Mizar]]></dc:creator><pubDate>Tue, 11 Nov 2008 10:07:21 GMT</pubDate></item></channel></rss>