<?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[Vector und Pointer]]></title><description><![CDATA[<p>Hallo Liebe Leute,</p>
<p>ich bereite mich gerade in C++ auf einiges vor und versuche mir besonders die Eigenheiten der Sprache anzueignen. Folgendes habe ich :</p>
<pre><code>class myclass
{
  public: myclass(int aa);
          int geta();
  private:
          int a;
};

myclass::myclass(int aa)
:a(aa)
{
}

int myclass geta()
{
  return a;
}

typedef myclass * mytype;

int main(...)
{
  mytype mt = new myclass(1);
  vector&lt;mytype&gt; v;
  v.push_back(mt);
  cout &lt;&lt; v.back()-&gt;geta() &lt;&lt; endl;
}
</code></pre>
<p>Das Funktioniert soweit, wenn ich jetzt aber v.pop_back() machen würde, dann würde er doch nur den Zeiger freimachen und nicht den referenzierten Speicher oder? Wie kriege ich hier also den Speicher wieder frei?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266584/vector-und-pointer</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 04:16:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266584.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 May 2010 09:18:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:18:16 GMT]]></title><description><![CDATA[<p>Hallo Liebe Leute,</p>
<p>ich bereite mich gerade in C++ auf einiges vor und versuche mir besonders die Eigenheiten der Sprache anzueignen. Folgendes habe ich :</p>
<pre><code>class myclass
{
  public: myclass(int aa);
          int geta();
  private:
          int a;
};

myclass::myclass(int aa)
:a(aa)
{
}

int myclass geta()
{
  return a;
}

typedef myclass * mytype;

int main(...)
{
  mytype mt = new myclass(1);
  vector&lt;mytype&gt; v;
  v.push_back(mt);
  cout &lt;&lt; v.back()-&gt;geta() &lt;&lt; endl;
}
</code></pre>
<p>Das Funktioniert soweit, wenn ich jetzt aber v.pop_back() machen würde, dann würde er doch nur den Zeiger freimachen und nicht den referenzierten Speicher oder? Wie kriege ich hier also den Speicher wieder frei?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895562</guid><dc:creator><![CDATA[Marcel (Gast)]]></dc:creator><pubDate>Tue, 11 May 2010 09:18:16 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:23:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">mytype p = v.back();
v.pop_back();
delete p;
</code></pre>
<p>Wenn du myclass nicht polymorph benutzen möchtest, macht es meistens mehr Sinn Kopien im vector&lt;myclass&gt; zu speichern. Ansonsten ist die Verwnedung von tr1::shared_ptr&lt;myclass&gt; in soclhen Fällen sehr praktisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895566</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 11 May 2010 09:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:23:25 GMT]]></title><description><![CDATA[<p>Den musst du selbst wieder freigeben.<br />
Schöne Alternativen sind da die shared_ptr oder Pointer Container aus TR1/boost.<br />
In deinem Beispiel macht es übrigens keinen Sinn, dynamisch erzeugte Objekte im vector abzulegen, kannst du die Speicherverwaltung nicht komplett dem vector überlassen indem du</p>
<pre><code class="language-cpp">std::vector&lt;myclass&gt;
</code></pre>
<p>benutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895567</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 11 May 2010 09:23:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:44:38 GMT]]></title><description><![CDATA[<p>Also der Hauptgrund warum ich das so mache ist, das ich größere Listen von eigenen Klassen brauche. Da die Objekte sehr groß werden, wird doch eine direkte Kopie im Vektor mehr Zeit in Anspruch nehmen als wenn ich nur Pointer kopiere oder?</p>
<p>Ansonsten habe ich mir gerade die shared_ptr Referenz mal angeschaut. In dem Beispiel wird ein Vector aus shared_ptr erzeugt. Das Prinzip ist klar, wäre das sorum dann besser?</p>
<blockquote>
<p>kannst du die Speicherverwaltung nicht komplett dem vector überlassen indem du</p>
<p>C/C++ Code:<br />
std::vector&lt;myclass&gt;</p>
<p>benutzt?</p>
</blockquote>
<p>Hm, das geht tatsächlich. Ich hatte da einen Compilerfehler in Erinnerung. Allerdings wäre dann trotzdem wieder eine vollständige Kopie des Objekts im Vektor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895584</guid><dc:creator><![CDATA[Marcel(Gast)]]></dc:creator><pubDate>Tue, 11 May 2010 09:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:56:41 GMT]]></title><description><![CDATA[<p>Marcel(Gast) schrieb:</p>
<blockquote>
<p>Also der Hauptgrund warum ich das so mache ist, das ich größere Listen von eigenen Klassen brauche. Da die Objekte sehr groß werden, wird doch eine direkte Kopie im Vektor mehr Zeit in Anspruch nehmen als wenn ich nur Pointer kopiere oder?</p>
</blockquote>
<p>Hast du es ausprobiert? Und wenn würde ich zu den Pointer-Containern aus boost raten.</p>
<p>Marcel(Gast) schrieb:</p>
<blockquote>
<p>Ansonsten habe ich mir gerade die shared_ptr Referenz mal angeschaut. In dem Beispiel wird ein Vector aus shared_ptr erzeugt. Das Prinzip ist klar, wäre das sorum dann besser?</p>
</blockquote>
<p>NEIN. shared_ptr ist nicht schlecht, gerade wenn unklar ist, wer die Verwaltung über die Objekte übernimmt. Doch shared_ptr ist wegen seiner Referenzzählung auch der teuerste Smartpointer, und sollte nicht als Allheilmittel eingesetzt werden. Wenn du weißt, das die Verwaltung deiner Klassen nur in dieser Liste passiert, wären die oben genannten Containerklassen deutlich vorzuziehen.</p>
<p>Marcel(Gast) schrieb:</p>
<blockquote>
<blockquote>
<p>kannst du die Speicherverwaltung nicht komplett dem vector überlassen indem du</p>
<p>C/C++ Code:<br />
std::vector&lt;myclass&gt;</p>
<p>benutzt?</p>
</blockquote>
<p>Hm, das geht tatsächlich. Ich hatte da einen Compilerfehler in Erinnerung. Allerdings wäre dann trotzdem wieder eine vollständige Kopie des Objekts im Vektor.</p>
</blockquote>
<p>Ja, nur verschätzt man sich leicht bei Performancefragen, und unterschätzt auch gerne den Aufwand von new/delete (gerade wenn es sich um sehr viele Objekte handelt). Was schneller ist, lässt sich nur am konkreten Beispiel prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895593</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 11 May 2010 09:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:57:39 GMT]]></title><description><![CDATA[<p>Marcel(Gast) schrieb:</p>
<blockquote>
<p>In dem Beispiel wird ein Vector aus shared_ptr erzeugt. Das Prinzip ist klar, wäre das sorum dann besser?</p>
</blockquote>
<p>Ja, solange shared_ptr anwendbar ist. Aufpassen muss man z.B. bei zyklischen Referenzen (wenn myclass selber shared_ptr zu anderen Instanzen von myclass hält).<br />
Ansonsten kannst du auch versuchen die Objekte etwas leichtgewichtiger zu machen, indem du z.B. den großen Datenhaufen woanders speicherst, verwaltet durch myclass.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895596</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 11 May 2010 09:57:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 09:59:58 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>...shared_ptr... Aufpassen muss man z.B. bei zyklischen Referenzen (wenn myclass selber shared_ptr zu anderen Instanzen von myclass hält).</p>
</blockquote>
<p>Hierfür gibt es weak_ptr (Ändert aber nichts daran, das man shared_ptr mit Bedacht einsetzen sollte [u.a. wegen seiner &quot;Kosten&quot;]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895597</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 11 May 2010 09:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 10:07:47 GMT]]></title><description><![CDATA[<p>Da sag ich doch mal vielen Dank für die Antworten. Die Performanceunterschiede werden ich dann einfach mal direkt &quot;messen&quot;. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895603</guid><dc:creator><![CDATA[Marcel(Gast)]]></dc:creator><pubDate>Tue, 11 May 2010 10:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 10:54:52 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Hierfür gibt es weak_ptr (Ändert aber nichts daran, das man shared_ptr mit Bedacht einsetzen sollte [u.a. wegen seiner &quot;Kosten&quot;]</p>
</blockquote>
<p>Beim shared_ptr von &quot;Kosten&quot; zu reden, finde ich in den meisten seiner Anwendungen übertrieben. Ich hab da auf jeden Fall noch nie 'Kosten' spüren können (was nicht heißt, dass es auch Anwendungen gibt, wo so eine Kleinigkeit wie ein Zähler einen Einfluss hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895620</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 11 May 2010 10:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 11:57:49 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Hierfür gibt es weak_ptr (Ändert aber nichts daran, das man shared_ptr mit Bedacht einsetzen sollte [u.a. wegen seiner &quot;Kosten&quot;]</p>
</blockquote>
<p>Beim shared_ptr von &quot;Kosten&quot; zu reden, finde ich in den meisten seiner Anwendungen übertrieben. Ich hab da auf jeden Fall noch nie 'Kosten' spüren können (was nicht heißt, dass es auch Anwendungen gibt, wo so eine Kleinigkeit wie ein Zähler einen Einfluss hat).</p>
</blockquote>
<p>Du hast halt Allokationen und Spin Locks im Code.<br />
Es summiert sich auf. Vorallem aber ist es unnötig, einfach die ptr-Container von boost nehmen und fertig - spart sogar Arbeit.</p>
<p>Ein großes Problem ist es nicht, aber Kleinvieh macht auch Mist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895649</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 11 May 2010 11:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Vector und Pointer on Tue, 11 May 2010 12:25:49 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Beim shared_ptr von &quot;Kosten&quot; zu reden, finde ich in den meisten seiner Anwendungen übertrieben.</p>
</blockquote>
<blockquote>
<p>...größere Listen...</p>
</blockquote>
<p>Ich setze auch shared_ptr ein, aber es ist dennoch nicht immer die beste Wahl. So wenig wie man im Vorfeld optimieren sollte, sollte man im Vorfeld jegliches Umfeld ignorieren.</p>
<p>Sofern es ausschließlich um die Verwaltung einer Liste mit Zeigern geht, ist shared_ptr fehl am Platz. Sofern man den Zeiger an mehreren Orten braucht, und die Aufräumreihenfolge nicht sichergestellt ist, ist shared_ptr/weak_ptr eine gute Wahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1895673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1895673</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 11 May 2010 12:25:49 GMT</pubDate></item></channel></rss>