<?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[Korrekte Elementreferenzierung bei std::vector]]></title><description><![CDATA[<p>Hallo!</p>
<p>Folgendes scheint offensichtlich nicht korrekt zu sein:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; testVektor;
int* elementZeiger = NULL;

testVektor.push_back(1);
elementZeiger = &amp;testVektor.back();
testVektor.push_back(2);     // elementZeiger zeigt nicht mehr auf das erste Element (1)
</code></pre>
<p>Ich schätze das ist in der dynamischen Speicherverwaltung von std::vector begründet.</p>
<p>Wie kann man aber dann zu einzelnen Elementen sicher referenzieren?<br />
Geht dies nur über die Zugriffsmethoden wie z.B. testVektor[i]?<br />
Das währe recht unbequem da ja die oft ohne vector-ownership zu einzelnen Elementen referenziert werden muß.</p>
<p>Danke für Eure Ratschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192252/korrekte-elementreferenzierung-bei-std-vector</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 11:08:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192252.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Sep 2007 09:06:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 09:06:58 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Folgendes scheint offensichtlich nicht korrekt zu sein:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; testVektor;
int* elementZeiger = NULL;

testVektor.push_back(1);
elementZeiger = &amp;testVektor.back();
testVektor.push_back(2);     // elementZeiger zeigt nicht mehr auf das erste Element (1)
</code></pre>
<p>Ich schätze das ist in der dynamischen Speicherverwaltung von std::vector begründet.</p>
<p>Wie kann man aber dann zu einzelnen Elementen sicher referenzieren?<br />
Geht dies nur über die Zugriffsmethoden wie z.B. testVektor[i]?<br />
Das währe recht unbequem da ja die oft ohne vector-ownership zu einzelnen Elementen referenziert werden muß.</p>
<p>Danke für Eure Ratschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363859</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 09:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 09:29:25 GMT]]></title><description><![CDATA[<p>Zeiger zu Elementen werden in der STL mit Iteratoren gelöst, dabei gibt es zwei Arten, den const_iterator (entspricht einem <code>const int*</code> und den normalen iterator, entspricht <code>int*</code> ).<br />
Wenn du dann einen Zeiger auf das 10. Element im vector brauchst, sähe das so aus:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; vec;
std::vector&lt;int&gt;::iterator ptr = vec.begin() + 10;
</code></pre>
<p><code>vec.begin()</code> gibt den Zeiger/Iterator auf das erste Element zurück.</p>
<p>Braucht man eine Funktion, die einen Zeiger bekommen soll und ab da über den Rest drüber-iterieren soll, kann man das so lösen:</p>
<pre><code class="language-cpp">void DoSomething( vector&lt;int&gt;::const_iterator beg, vector&lt;int&gt;::const_iterator end )
{
    int some_value = 0;
    for ( ; beg!=end; beg++ )
        some_value += 10 * (*beg);
    // Mit dereferenzieren des Iterators bekommst du den Wert dahinter, bzw kannst ihn auch zuweisen.
    // Zuweisen natürlich nur bei einem vector&lt;int&gt;::iterator, nicht bei einem const_iterator :)
}

...

vector&lt;int&gt; vec;
// füllen
DoSomething( vec.begin(), vec.end() );
// oder sowas
DoSomething( vec.begin()+5, vec.end()-5 );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1363870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363870</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 12 Sep 2007 09:29:25 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 09:42:22 GMT]]></title><description><![CDATA[<p>Das ist zwar alles richtig, aber haarscharf an der Frage vorbei: Auch die Iteratoren werden ungültig, wenn sich der vector ändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363887</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 12 Sep 2007 09:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 09:43:18 GMT]]></title><description><![CDATA[<p>mörks</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363889</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 12 Sep 2007 09:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 09:49:05 GMT]]></title><description><![CDATA[<p>@KreuzQuer: Du kannst entweder durch entsprechende reserve-Aufrufe verhindern, dass der Vektor neu organisiert wird und dadurch Iteratoren ungültig werden. Das funktioniert natürlich nur, wenn du die maximale Zahl einzufügender Elemente kennst. Oder du kannst dich informieren, unter welchen Bedingungen bei den verschiedenen Containern Iteratoren ungültig werden und dementsprechend einen anderen Container wählen. std::list ist in der Hinsicht z.B. ziemlich robust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363898</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 12 Sep 2007 09:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 10:13:04 GMT]]></title><description><![CDATA[<p>Na dann verwalte ich im Vektor lieber Zeiger auf die Elemente.</p>
<p>Dabei muß ich mich zwar um die Speicherfreigabe kümmern, werde aber vom default-Ctor/-Dtor Gedöhnst entlastet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363906</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 10:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 10:14:34 GMT]]></title><description><![CDATA[<p>Das löst aber dein Problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363907</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 12 Sep 2007 10:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 10:21:37 GMT]]></title><description><![CDATA[<p>Nun doch - ich referenziere dann halt mittels den Elementen selbst, anstatt mit einem Zeiger auf die Referenz.</p>
<p>Also:</p>
<pre><code class="language-cpp">std::vector&lt;Blah*&gt; testVektor;
Blah* elementZeiger = NULL;

testVektor.push_back(new Blah(1));
elementZeiger = testVektor.back();
testVektor.push_back(new Blah(2));     // elementZeiger zeigt weiterhin auf das erste Element Blah(1)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1363909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363909</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 10:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 10:23:46 GMT]]></title><description><![CDATA[<p>Dann brauchst du aber den vector nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363910</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 12 Sep 2007 10:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 10:29:28 GMT]]></title><description><![CDATA[<p>Sorry, ich habe meinen Verwendungszweck nicht beschrieben.</p>
<p>Es soll in mehreren Bereichen, die kein ownership des Vektors haben, auf die Elemente referenziert werden.<br />
Ich brauche daher weiterhin einen Vektor für die Zeiger, da der Speicher für die Elemente ja zentral verwaltet werden muß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363911</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 10:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 12:01:55 GMT]]></title><description><![CDATA[<p>KreuzQuer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::vector&lt;Blah*&gt; testVektor;
Blah* elementZeiger = NULL;

testVektor.push_back(new Blah(1));
elementZeiger = testVektor.back();
testVektor.push_back(new Blah(2));     // elementZeiger zeigt weiterhin auf das erste Element Blah(1)
</code></pre>
</blockquote>
<p>Da bist Du aber auf den besten Weg Speicherlöcher zu produzieren. In einen Container der Standard Library legt man niemals Zeiger rein, wenn über diese Zeiger die Ownership verwaltet werden muß. Also entweder so</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

class A {};

int main () {
  std::size_t const size = 10
  A v[size];

  std::vector&lt;A*&gt; vec;

  for (std::size_t i = 0; i != size; ++i) {
    vec.push_back(&amp;v[i]);
  }
}
</code></pre>
<p>oder so</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;boost/shared_pointer.hpp&gt;

class A {};

int main () {
  std::size_t const size = 10;

  std::vector&lt;boost::shared_pointer&lt;A&gt; &gt; v;

  for (std::size_t i = 0; i != size; ++i) {
    v.push_back(boost::shared_pointer&lt;A&gt;(new A));
  }
}
</code></pre>
<p>Wenn Du Objekte in den Vektor einfügst und die Kapazität reicht nicht mehr aus, dann werden alle Iteratoren/Zeiger auf Objekte ungültig. Das ist so und kann nicht geändert werden. Da hilft nur dies zu vermeiden bzw. über einen eigenen Memory Allocator die Reallozierung gänzlich zu verhindern. Wenn das alles nicht gangbar ist, solltest Du über ein anderes Design nachdenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1363965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363965</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 12 Sep 2007 12:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 14:19:40 GMT]]></title><description><![CDATA[<p>~john:</p>
<p>In deinem Beispiel verstehe ich dann aber wirklich nicht den Sinn des Vektors.</p>
<p>Meine Anwendung von dem Vektor von Zeigern sieht wie folgt aus:</p>
<pre><code class="language-cpp">class Typ;
class Klasse
{
   private:
     std:vector&lt;Typ*&gt; typVektor;

   public:

     Klasse() {};
     Klasse() {for(int i=0; i &lt; typVektor.size(); i++) {delete typVektor[i];}

     const Typ* PushTypElement(Typ element) {typVektor.push_back(new Typ(element)); return typVektor.back()}
};
</code></pre>
<p>Ich verstehe nicht was daran zu anfällig für Speicherprobleme sein soll.<br />
Danke für die Aufklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364052</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 14:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 14:29:43 GMT]]></title><description><![CDATA[<p>Wieso wird eigentlich immer gleich zu Pointern gegriffen?<br />
Wenn std::vector ungeeignet ist, weil er ggf. keine stabilen Referenzen liefert, dann benutz einen anderen Container. std::deque dürfte für den skizzierten Fall geeignet sein.<br />
achja:</p>
<p>KreuzQuer schrieb:</p>
<blockquote>
<p>Das währe recht unbequem da ja die oft ohne vector-ownership zu einzelnen Elementen referenziert werden muß.</p>
</blockquote>
<p>Die erste Satzhälfte verstehe ich ja noch, den Rest nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364060</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Sep 2007 14:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 14:39:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wieso wird eigentlich immer gleich zu Pointern gegriffen?<br />
Wenn std::vector ungeeignet ist, weil er ggf. keine stabilen Referenzen liefert, dann benutz einen anderen Container. std::deque dürfte für den skizzierten Fall geeignet sein.</p>
</blockquote>
<p>Ich verstehe nicht warum std::deque dafür geeigneter sein soll.</p>
<blockquote>
<p>achja:</p>
<p>KreuzQuer schrieb:</p>
<blockquote>
<p>Das währe recht unbequem da ja die oft ohne vector-ownership zu einzelnen Elementen referenziert werden muß.</p>
</blockquote>
<p>Die erste Satzhälfte verstehe ich ja noch, den Rest nicht...</p>
</blockquote>
<p>Gemeint war, dass es aufwändiger ist z.B. über den Indexwert eines Elementes auf ein Element zuzugreifen (Funktionsaufruf von außerhalb notwendig), als direkt eine Referenz (im Beispiel Zeiger auf konstantes Objekt) zum Element zu besitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364070</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 14:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 14:44:06 GMT]]></title><description><![CDATA[<p>Du könntest auch die eigentlichen Objekte in einem Container wie list (oder deque -- deque invalidiert Iteratoren glaub ich nur beim Einfügen in der Mitte, bin aber nicht sicher) lagern, und in einem vector Pointer darauf verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364075</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 12 Sep 2007 14:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 14:54:55 GMT]]></title><description><![CDATA[<p>KreuzQuer schrieb:</p>
<blockquote>
<p>~john:</p>
<p>In deinem Beispiel verstehe ich dann aber wirklich nicht den Sinn des Vektors.</p>
</blockquote>
<p>Das Array dient nur dazu Elemente für den Vektor bereitzustellen, es hätte auch irgend welche anderen Objekte sein können. So ist das nur kompakter zu schreiben.</p>
<blockquote>
<p>Meine Anwendung von dem Vektor von Zeigern sieht wie folgt aus:</p>
<pre><code class="language-cpp">class Typ;
class Klasse
{
   private:
     std:vector&lt;Typ*&gt; typVektor;

   public:

     Klasse() {};
     Klasse() {for(int i=0; i &lt; typVektor.size(); i++) {delete typVektor[i];}

     const Typ* PushTypElement(Typ element) {typVektor.push_back(new Typ(element)); return typVektor.back()}
};
</code></pre>
<p>Ich verstehe nicht was daran zu anfällig für Speicherprobleme sein soll.<br />
Danke für die Aufklärung.</p>
</blockquote>
<p>Denk mal darüber nach was passiert, wenn ein Objekt der Klasse &quot;Klasse&quot; destruiert wird? Wie sieht es mit dem Kopierzuweisungsoperator aus? ...</p>
<p>Alle Elemente im Vektor typVektor werden destruiert, da es sich um PODs (einfache Zeiger auf Typ) handelt wird gar nichts gemacht, und der Speicher für die referenzierte Objekte vom Typ &quot;Typ&quot; wird <strong>nicht</strong> freigegeben und die Destruktoren für die Objekte werden <strong>nicht</strong> aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364084</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 12 Sep 2007 14:54:55 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 15:01:53 GMT]]></title><description><![CDATA[<p>Um das Problem zu verdeutlichen</p>
<pre><code class="language-cpp">class Typ;
class Klasse
{
   private:
     std:vector&lt;Typ*&gt; typVektor;

   public:

     Klasse() {};
     ~Klasse() {for(int i=0; i &lt; typVektor.size(); i++) {delete typVektor[i];}

     const Typ* PushTypElement(Typ element) {typVektor.push_back(new Typ(element)); return typVektor.back()}
};

int main () {
  Klasse A;
  // Code zum Füllen von A;
  {
    Klasse B = A;
  } // ab hier enthält A nur noch Zeiger auf Datenmüll!
} // hier versucht der Destruktor bereits freigegeben Objekte freizugeben!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364095</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 12 Sep 2007 15:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 15:01:27 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Denk mal darüber nach was passiert, wenn ein Objekt der Klasse &quot;Klasse&quot; destruiert wird?<br />
Alle Elemente im Vektor typVektor werden destruiert, da es sich um PODs (einfache Zeiger auf Typ) handelt wird gar nichts gemacht, und der Speicher für die referenzierte Objekte vom Typ &quot;Typ&quot; wird <strong>nicht</strong> freigegeben und die Destruktoren für die Objekte werden <strong>nicht</strong> aufgerufen.</p>
</blockquote>
<p>Ich hatte mich lediglich vertippt - der Destruktur ist natürlich definiert:</p>
<pre><code class="language-cpp">class Typ;
class Klasse
{
   private:
     std:vector&lt;Typ*&gt; typVektor;

   public:

      Klasse() {};
     ~Klasse() {for(int i=0; i &lt; typVektor.size(); i++) {delete typVektor[i]};}

     const Typ* PushTypElement(Typ element) {typVektor.push_back(new Typ(element)); return typVektor.back();}
};
</code></pre>
<p>Da wird der Speicher korrekt freigegen, und niemand als das Objekt selbst hat schreibenden Zugriff auf die Elemente hinter dem Zeiger.<br />
Die Objekte, die eine Referenz zu den Elementen besitzen, werden stets vor dem Objekt mit dem Vektor selbst vernichtet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364096</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 15:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 15:11:58 GMT]]></title><description><![CDATA[<p>KreuzQuer schrieb:</p>
<blockquote>
<p>Da wird der Speicher korrekt freigegen, und niemand als das Objekt selbst hat schreibenden Zugriff auf die Elemente hinter dem Zeiger.</p>
</blockquote>
<p>Schau Dir das Posting vorher an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364102</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 12 Sep 2007 15:11:58 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 15:26:19 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Um das Problem zu verdeutlichen</p>
<pre><code class="language-cpp">int main () {
  Klasse A;
  // Code zum Füllen von A;
  {
    Klasse B = A;
  } // ab hier enthält A nur noch Zeiger auf Datenmüll!
} // hier versucht der Destruktor bereits freigegeben Objekte freizugeben!
</code></pre>
</blockquote>
<p>Das ist doch Sache des Copy-Ctor, der natürlich korrekt definiert sein muß wenn man ihn verwenden will.<br />
Nach dieser Argumentation dürfte man ja gar keine Zeiger als Objektvariablen verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364109</guid><dc:creator><![CDATA[KreuzQuer]]></dc:creator><pubDate>Wed, 12 Sep 2007 15:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Wed, 12 Sep 2007 17:00:27 GMT]]></title><description><![CDATA[<p>Es geht um Kontrakte. Alle Container der Standard Library sind auf Speicherung von Werten und nicht von Zeiger auf Objekte ausgelegt. Daher empfiehlt es sich nur Objekte direkt oder SmartPointer auf Objekte in einem Container der Standard Library abzulegen, da man so weniger Arbeit hat und nichts übersieht.</p>
<pre><code class="language-cpp">class Typ;
class Klasse {
  std:vector&lt;boost::shared_ptr&lt;Typ&gt; &gt; typVektor;
public:
  Typ const* PushTypElement(Typ element) {
    boost::shared_ptr&lt;Typ&gt; sp (new Typ(element));
    typVektor.push_back(sp);
    return sp.get();
  }
};
</code></pre>
<p>Alternativ kann man sich natürlich auch direkt die SmartPointer zurückliefern lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364160</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 12 Sep 2007 17:00:27 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Elementreferenzierung bei std::vector on Thu, 13 Sep 2007 10:10:23 GMT]]></title><description><![CDATA[<p>KreuzQuer schrieb:</p>
<blockquote>
<p>~john schrieb:</p>
<blockquote>
<p>Um das Problem zu verdeutlichen</p>
<pre><code class="language-cpp">int main () {
  Klasse A;
  // Code zum Füllen von A;
  {
    Klasse B = A;
  } // ab hier enthält A nur noch Zeiger auf Datenmüll!
} // hier versucht der Destruktor bereits freigegeben Objekte freizugeben!
</code></pre>
</blockquote>
<p>Das ist doch Sache des Copy-Ctor, der natürlich korrekt definiert sein muß wenn man ihn verwenden will.<br />
Nach dieser Argumentation dürfte man ja gar keine Zeiger als Objektvariablen verwenden.</p>
</blockquote>
<p>ich klink mich hier mal ein, ggf. ist der punkt hier nicht ganz klar</p>
<pre><code class="language-cpp">int main () {
  Klasse A;
  // Code zum Füllen von A;
  {
    Klasse B = A;
    //hier zeigen die zeiger aus A und B auf die gleichen Obejekte!
  } //hier wird der dtor von B aufgerufen, was dazu führt das die Objekte zerstört werden
     // ab hier enthält A nur noch Zeiger auf Datenmüll! weil dotr von B sie
     //zerstört hat !!
} // hier versucht der Destruktor von A bereits freigegeben Objekte freizugeben!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364549</guid><dc:creator><![CDATA[ConfusedGuy]]></dc:creator><pubDate>Thu, 13 Sep 2007 10:10:23 GMT</pubDate></item></channel></rss>