<?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[obj X in vextor in vector]]></title><description><![CDATA[<p>Wenn ich ein Objekt X in einem vector habe und diesen vector wieder in einen vector setze und anschließend alles destuiere, was kommt zuerst? innerer oder äußerer vector? und warum? wie kann man das beweisen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153572/obj-x-in-vextor-in-vector</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 14:06:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153572.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Jul 2006 15:05:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to obj X in vextor in vector on Tue, 18 Jul 2006 15:05:11 GMT]]></title><description><![CDATA[<p>Wenn ich ein Objekt X in einem vector habe und diesen vector wieder in einen vector setze und anschließend alles destuiere, was kommt zuerst? innerer oder äußerer vector? und warum? wie kann man das beweisen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099874</guid><dc:creator><![CDATA[hew_]]></dc:creator><pubDate>Tue, 18 Jul 2006 15:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Tue, 18 Jul 2006 15:16:18 GMT]]></title><description><![CDATA[<p>Ein vector ruft in seinem Destruktor immer erst die Destruktoren der in ihm enthaltenden Elemente auf. Das sind in diesem Fall wieder vector-Instanzen. etc.<br />
Wenn du es genau wissen willst, schau doch einfach in den Quelltext vom Destruktor von vector deiner STL-Bibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099879</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 18 Jul 2006 15:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Tue, 18 Jul 2006 17:20:10 GMT]]></title><description><![CDATA[<p>Das machen wir zusätzlich experimentell mit einer Testklasse, die Aktionen ihres Innenlebens loggt (Testklasse siehe: <a href="http://www.henkessoft.de/C++/C++%20Fortgeschrittene/C++_Fortgeschrittene.htm#2.2._Unsere_Testklasse_loggt_mit" rel="nofollow">http://www.henkessoft.de/C++/C++ Fortgeschrittene/C++_Fortgeschrittene.htm#2.2._Unsere_Testklasse_loggt_mit</a> ):</p>
<pre><code class="language-cpp">//Testklasse 

#define _TEST_
#include &lt;windows.h&gt;
#include &lt;conio.h&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

void textcolor(WORD color)
{
    SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color);
}

const int farbe1 =  3;
const int farbe2 = 15;

class xINT
{
private:
  int num; 
  static int countCtor;
  static int countDtor; 
  static int countCopycon; 
  static int countOpAssign; 

public:
  xINT()
  {
      #ifdef _TEST_ 
      textcolor(farbe1);
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;ctor&quot; &lt;&lt; std::endl; 
      textcolor(farbe2);
      #endif
      ++countCtor;
  }

 ~xINT()
  {
      #ifdef _TEST_
      textcolor(farbe1); 
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;dtor&quot; &lt;&lt; std::endl;
      textcolor(farbe2);
      #endif     
      ++countDtor;
  }

  xINT(const xINT&amp; x)
  {
      #ifdef _TEST_
      textcolor(farbe1); 
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;copycon von &quot; &lt;&lt; std::dec &lt;&lt; &amp;x &lt;&lt; std::endl;
      textcolor(farbe2);
      #endif 
      num = x.getNum();
      ++countCopycon;
  }

  xINT&amp; operator=(const xINT&amp; x)
  {
      if (&amp;x == this)
      {
          #ifdef _TEST_
          textcolor(farbe1);           
          std::cout &lt;&lt; &quot;Selbstzuweisung mit op=&quot; &lt;&lt; std::endl;
          textcolor(farbe2);
          #endif
      }
      #ifdef _TEST_
      textcolor(farbe1);
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;op= von &quot; &lt;&lt; std::dec &lt;&lt; &amp;x &lt;&lt; std::endl;
      textcolor(farbe2);
      #endif
      num = x.getNum();
      ++countOpAssign;
      return *this;
  }

  int getNum() const {return num;}
  void setNum(int val) {num = val;}
  static void statistik(std::ostream&amp;);
  static void reset();
};

int xINT::countCtor     = 0;
int xINT::countDtor     = 0; 
int xINT::countCopycon  = 0; 
int xINT::countOpAssign = 0; 

void xINT::statistik(std::ostream&amp; os)
{
  textcolor(farbe1); 
  os   &lt;&lt; &quot;Ctor:    &quot; &lt;&lt; countCtor    &lt;&lt; std::endl
       &lt;&lt; &quot;Dtor:    &quot; &lt;&lt; countDtor    &lt;&lt; std::endl
       &lt;&lt; &quot;Copycon: &quot; &lt;&lt; countCopycon &lt;&lt; std::endl
       &lt;&lt; &quot;op=:     &quot; &lt;&lt; countOpAssign; 
  textcolor(farbe2);   
}   

void xINT::reset()
{
    countCtor     = 0;
    countDtor     = 0; 
    countCopycon  = 0; 
    countOpAssign = 0; 
}

std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const xINT&amp; x)
{
  os &lt;&lt; x.getNum();
  return os;
}

std::istream&amp; operator&gt;&gt; (std::istream&amp; is, xINT&amp; x)
{
  int i;
  is &gt;&gt; i;
  x.setNum(i);
  return is;
}

bool operator&lt; (const xINT&amp; a, const xINT&amp; b)
{
    return a.getNum() &lt; b.getNum();
}

bool operator&gt; (const xINT&amp; a, const xINT&amp; b)
{
    return a.getNum() &gt; b.getNum();
}

bool operator== (const xINT&amp; a, const xINT&amp; b)
{
    return a.getNum() == b.getNum();
}

bool operator!= (const xINT&amp; a, const xINT&amp; b)
{
    return a.getNum() != b.getNum();
}

/***********************************************************/

// Klient für Testklasse

int main()
{
  {
    cout &lt;&lt; &quot;xINT konstruieren\n&quot; &lt;&lt; endl;
    xINT x; //ctor der Testklasse xINT in Aktion
    xINT::statistik(cout);
    xINT::reset();
    getch();

    vector&lt;xINT&gt; ct; //Container
    const int N = 10;
    ct.reserve(N);   //Wichtig für die Effizienz!

    cout &lt;&lt; &quot;\n\nct.push_back(x)\n&quot; &lt;&lt; endl;
    for(int i=0; i&lt;N; ++i)
    {
        x.setNum(i);
        ct.push_back(x); //copycon der Testklasse xINT in Aktion
    }
    xINT::statistik(cout);
    xINT::reset();
    getch();

    cout &lt;&lt; &quot;\n\nct1.push_back(ct);\n&quot; &lt;&lt; endl;
    vector&lt; vector&lt;xINT&gt; &gt; ct1; //Container
    ct1.reserve(1);
    ct1.push_back(ct);
    xINT::statistik(cout);
    xINT::reset();
    getch();
    cout &lt;&lt; &quot;\n\n} bewirkt dtor\n&quot; &lt;&lt; endl;
  }
  xINT::statistik(cout);
  xINT::reset();
  getch();

  return 0;
}

output auf cout:
[code]
xINT konstruieren

0x22ff50: ctor
Ctor:    1
Dtor:    0
Copycon: 0
op=:     0

ct.push_back(x)

0x3f3ec0: copycon von 0x22ff50
0x3f3ec4: copycon von 0x22ff50
0x3f3ec8: copycon von 0x22ff50
0x3f3ecc: copycon von 0x22ff50
0x3f3ed0: copycon von 0x22ff50
0x3f3ed4: copycon von 0x22ff50
0x3f3ed8: copycon von 0x22ff50
0x3f3edc: copycon von 0x22ff50
0x3f3ee0: copycon von 0x22ff50
0x3f3ee4: copycon von 0x22ff50
Ctor:    0
Dtor:    0
Copycon: 10
op=:     0

ct1.push_back(ct);

0x3f3ef8: copycon von 0x3f3ec0
0x3f3efc: copycon von 0x3f3ec4
0x3f3f00: copycon von 0x3f3ec8
0x3f3f04: copycon von 0x3f3ecc
0x3f3f08: copycon von 0x3f3ed0
0x3f3f0c: copycon von 0x3f3ed4
0x3f3f10: copycon von 0x3f3ed8
0x3f3f14: copycon von 0x3f3edc
0x3f3f18: copycon von 0x3f3ee0
0x3f3f1c: copycon von 0x3f3ee4
Ctor:    0
Dtor:    0
Copycon: 10
op=:     0

} bewirkt dtor

0x3f3ef8: dtor &lt;--- Elemente xINT erzeugt durch vector&lt; vector&lt;xINT&gt; &gt; ct1
0x3f3efc: dtor      werden abgebaut
0x3f3f00: dtor
0x3f3f04: dtor
0x3f3f08: dtor
0x3f3f0c: dtor
0x3f3f10: dtor
0x3f3f14: dtor
0x3f3f18: dtor
0x3f3f1c: dtor
0x3f3ec0: dtor &lt;--- Ursprüngliche Elemente von vector&lt;xINT&gt; ct 
0x3f3ec4: dtor      kommen anschließend an die Reihe
0x3f3ec8: dtor
0x3f3ecc: dtor
0x3f3ed0: dtor
0x3f3ed4: dtor
0x3f3ed8: dtor
0x3f3edc: dtor
0x3f3ee0: dtor
0x3f3ee4: dtor
0x22ff50: dtor &lt;--- xINT auf dem Stack 
Ctor:    0
Dtor:    21
Copycon: 0
op=:     0[/code]
}
</code></pre>
<p>Man sieht, die Realität ist irgendwie komplexer, als das oben beschrieben dargestellt wird. Die Preisfrage ist: Wo auf dem Heap befinden sich zu welchem Zeitpunkt eigentlich die echten 10 Elemente des Vector ct? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099925</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Tue, 18 Jul 2006 17:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Tue, 18 Jul 2006 17:22:43 GMT]]></title><description><![CDATA[<p>Wir verändern den Versuchsaufbau auf zwei Arten, indem wir einmal die Elemente des inneren vector mit ct.clear() und ein anderes Mal die Elemente des äußeren vector mit ct1.clear() &quot;zerstörend&quot; aufrufen:</p>
<p>Experiment 1 (innerer vector):</p>
<pre><code class="language-cpp">//...
  cout &lt;&lt; &quot;\n\nct.clear() bewirkt dtor\n&quot; &lt;&lt; endl;
    ct.clear();
    xINT::statistik(cout);
    xINT::reset();
    getch();

    cout &lt;&lt; &quot;\n\n} bewirkt dtor\n&quot; &lt;&lt; endl;
  }
  xINT::statistik(cout);
  xINT::reset();
  getch();

  return 0;
}
</code></pre>
<p>output:</p>
<pre><code>ct.clear() bewirkt dtor

0x3f3ec0: dtor
0x3f3ec4: dtor
0x3f3ec8: dtor
0x3f3ecc: dtor
0x3f3ed0: dtor
0x3f3ed4: dtor
0x3f3ed8: dtor
0x3f3edc: dtor
0x3f3ee0: dtor
0x3f3ee4: dtor
Ctor:    0
Dtor:    10
Copycon: 0
op=:     0

} bewirkt dtor

0x3f3ef8: dtor
0x3f3efc: dtor
0x3f3f00: dtor
0x3f3f04: dtor
0x3f3f08: dtor
0x3f3f0c: dtor
0x3f3f10: dtor
0x3f3f14: dtor
0x3f3f18: dtor
0x3f3f1c: dtor
0x22ff50: dtor
Ctor:    0
Dtor:    11
Copycon: 0
op=:     0
</code></pre>
<p>Experiment 2 (äußerer vector):</p>
<pre><code class="language-cpp">//...
   cout &lt;&lt; &quot;\n\nct1.clear() bewirkt dtor\n&quot; &lt;&lt; endl;
    ct1.clear();
    xINT::statistik(cout);
    xINT::reset();
    getch();

    cout &lt;&lt; &quot;\n\n} bewirkt dtor\n&quot; &lt;&lt; endl;
  }
  xINT::statistik(cout);
  xINT::reset();
  getch();

  return 0;
}
</code></pre>
<p>output:</p>
<pre><code>ct1.clear() bewirkt dtor

0x3f3ef8: dtor
0x3f3efc: dtor
0x3f3f00: dtor
0x3f3f04: dtor
0x3f3f08: dtor
0x3f3f0c: dtor
0x3f3f10: dtor
0x3f3f14: dtor
0x3f3f18: dtor
0x3f3f1c: dtor
Ctor:    0
Dtor:    10
Copycon: 0
op=:     0

} bewirkt dtor

0x3f3ec0: dtor
0x3f3ec4: dtor
0x3f3ec8: dtor
0x3f3ecc: dtor
0x3f3ed0: dtor
0x3f3ed4: dtor
0x3f3ed8: dtor
0x3f3edc: dtor
0x3f3ee0: dtor
0x3f3ee4: dtor
0x22ff50: dtor
Ctor:    0
Dtor:    11
Copycon: 0
op=:     0
</code></pre>
<p>Das Ergebnis ist unterschiedlich. Wie steht es jetzt mit der obigen Aussage? Wo sind die echten Elemente von ct? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099946</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Tue, 18 Jul 2006 17:22:43 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Tue, 18 Jul 2006 17:30:13 GMT]]></title><description><![CDATA[<p>Das ist ja interessant. Der äußere vector erzeugt offenbar &quot;Doppelgänger&quot;, die er bei seinem clear() oder seinem Ableben auch zerstört. Die Originale des inneren vectors überleben offensichtlich den Tod des äußeren vectors und seiner Doppelgänger, müssen dann aber auch kollektiven Selbstmord begehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Wozu sind diese Doppelgänger eigentlich da? Wer greift wann auf diese zu?<br />
Rattenscharf! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099951</guid><dc:creator><![CDATA[hew_]]></dc:creator><pubDate>Tue, 18 Jul 2006 17:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Wed, 19 Jul 2006 17:44:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Wozu sind diese Doppelgänger eigentlich da? Wer greift wann auf diese zu?</p>
</blockquote>
<p>Beim ersten vector wurde x (vom Typ xINT) ebenfalls jeweils vom Stack zum Heap &quot;kopierend konstruiert&quot; (copycon). Das läuft beim zweiten vector gleich. STL bedeutet: &quot;copy in, copy out&quot; (Scott Meyers). Man hat es ständig mit &quot;Doppelgängern&quot; zu schaffen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ansonsten müsste man mit Zeigern/Referenzen arbeiten.</p>
<blockquote>
<p>Die Originale des inneren vectors überleben offensichtlich den Tod des äußeren vectors und seiner Doppelgänger, müssen dann aber auch kollektiven Selbstmord begehen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Wozu sind diese Doppelgänger eigentlich da? Wer greift wann auf diese zu?</p>
</blockquote>
<p>Den Originalen ist es egal, ob ihre &quot;Doppelgänger&quot; gekillt werden. Wie gesagt, STL liebt den copycon. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1099992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1099992</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 19 Jul 2006 17:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to obj X in vextor in vector on Wed, 19 Jul 2006 08:10:48 GMT]]></title><description><![CDATA[<p>Destruktor von vector:</p>
<pre><code class="language-cpp">~vector()
{	
  // destroy the object
  _Tidy();
}

void _Tidy()
{	
  // free all storage
  if (_Myfirst != 0)
  {	
    // something to free, destroy and deallocate it
    _Destroy(_Myfirst, _Mylast);
    this-&gt;_Alval.deallocate(_Myfirst, _Myend - _Myfirst);
  }
  _Myfirst = 0, 
  _Mylast = 0, 
  _Myend = 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1100185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1100185</guid><dc:creator><![CDATA[hew_]]></dc:creator><pubDate>Wed, 19 Jul 2006 08:10:48 GMT</pubDate></item></channel></rss>