<?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[std:vector push_back deconstruiert meine Elemente]]></title><description><![CDATA[<p>Ich habe eine vector Liste der Klasse PhaseObject</p>
<pre><code class="language-cpp">vector&lt;PhaseObject&gt; PhaseObjects;
</code></pre>
<p>diese Klasse enthält unter anderem das Element</p>
<pre><code class="language-cpp">public:
	beamshapes ComplexBeam;
</code></pre>
<p>welches abgeleitet ist von 'ComplexBeam'</p>
<pre><code class="language-cpp">class beamshapes : public ComplexBeam
</code></pre>
<p>welches drei dynamische Arrays enthält.</p>
<p>Wenn ich nun ein Objekt von PhaseObject, hier FresnelPhaseObject, zum Vector PhaseObjects hinzufüge:</p>
<pre><code class="language-cpp">PhaseObjects.push_back(FresnelPhaseObject);
</code></pre>
<p>dann wird dabei der Decontructor von PhaseObject und damit auch von ComplexBeam aufgerufen. Dabei werden alle dynamischen Arrays gelöscht.</p>
<p>Das Vector Element enthält damit nur noch dekonstruierte Pointer und jeder zugriff auf das Element lässt die Applikation abstürzen.</p>
<p>was läuft da falsch?<br />
Ich bin leider schon sehr verweifelt, da ich nicht mehr weiß nach was ich noch suchen soll.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211805/std-vector-push_back-deconstruiert-meine-elemente</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 11:24:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211805.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Apr 2008 20:53:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Sun, 27 Apr 2008 20:54:47 GMT]]></title><description><![CDATA[<p>Ich habe eine vector Liste der Klasse PhaseObject</p>
<pre><code class="language-cpp">vector&lt;PhaseObject&gt; PhaseObjects;
</code></pre>
<p>diese Klasse enthält unter anderem das Element</p>
<pre><code class="language-cpp">public:
	beamshapes ComplexBeam;
</code></pre>
<p>welches abgeleitet ist von 'ComplexBeam'</p>
<pre><code class="language-cpp">class beamshapes : public ComplexBeam
</code></pre>
<p>welches drei dynamische Arrays enthält.</p>
<p>Wenn ich nun ein Objekt von PhaseObject, hier FresnelPhaseObject, zum Vector PhaseObjects hinzufüge:</p>
<pre><code class="language-cpp">PhaseObjects.push_back(FresnelPhaseObject);
</code></pre>
<p>dann wird dabei der Decontructor von PhaseObject und damit auch von ComplexBeam aufgerufen. Dabei werden alle dynamischen Arrays gelöscht.</p>
<p>Das Vector Element enthält damit nur noch dekonstruierte Pointer und jeder zugriff auf das Element lässt die Applikation abstürzen.</p>
<p>was läuft da falsch?<br />
Ich bin leider schon sehr verweifelt, da ich nicht mehr weiß nach was ich noch suchen soll.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499281</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 27 Apr 2008 20:54:47 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Sun, 27 Apr 2008 20:56:40 GMT]]></title><description><![CDATA[<p>Du musst den Copy-Constructor ordentlich überladen (bzw alle &quot;großen drei&quot;, Copy-Constr, Zuweisungs-Op und Destruktor).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499284</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 27 Apr 2008 20:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Sun, 27 Apr 2008 20:58:41 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Du musst den Copy-Constructor ordentlich überladen (bzw alle &quot;großen drei&quot;, Copy-Constr, Zuweisungs-Op und Destruktor).</p>
</blockquote>
<p>Das sagt mir erstmal gar nichts. Kannst du mir dazu weiter Hinweise / Dokus geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499286</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Sun, 27 Apr 2008 20:58:41 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Sun, 27 Apr 2008 21:08:30 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Das sagt mir erstmal gar nichts. Kannst du mir dazu weiter Hinweise / Dokus geben?</p>
</blockquote>
<p>Ist im Prinzip simpel: Wenn du mit push_back ein Element hinzufügst, muss u.U. (falls der vector nicht genug Speicher reserviert hat) neuer/größerer Speicher allokiert werden. Dazu werden die alten Elemente rüberkopiert (auf dem neuen Speicher wird für jedes alte Element der Copy-Constructor auf dem entsprechenden neuen Speicherstück aufgerufen, mit Parameter das Objekt auf dem alten Speicher). Dann wird der alte Speicher de-allokiert, vorher aber noch für jedes Element darauf der Destruktor aufgerufen, damit die Objekte wissen, dass sie weg sind.<br />
Copy-Constructoren haben immer folgende Form:</p>
<pre><code class="language-cpp">class xyz
{
    xyz( const xyz&amp; other );
};
</code></pre>
<p>Um das Verhalten vom vector bei push_back nochmal deutlicher zu machen:</p>
<pre><code>Falls noch genug Speicher reserviert ist:
    neues Element hinzufügen

Sonst:
    Speicher allokieren, wo auch das neue Element reinpasst
    Auf den neuen Speicher alle Objekte des alten Speichers rüberkopieren, mit Copy-Constructor-Aufruf (Fachwort placement-new)
    Für alle Objekte auf dem alten Speicher den Destruktor aufrufen
    Den alten Speicher wieder freigeben
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1499289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499289</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 27 Apr 2008 21:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Sun, 27 Apr 2008 21:11:33 GMT]]></title><description><![CDATA[<p>Achso, und das Problem bei dir ist wahrscheinlich so:</p>
<pre><code class="language-cpp">class Data
{
    public:
        Data()
        {
            m_ptr = new char [100]; // oder so
        }

        ~Data()
        {
            delete[] m_ptr;
        }

    private:
        char* m_ptr;
};
</code></pre>
<p>Der Compiler generiert immer automatisch einen Copy-Constructor, wenn du das nicht machst. Darin werden dann einfach alle Member-Variablen der Klasse kopiert, die neue Instanz von &quot;Data&quot; hat dann also den selben Zeiger. Die alte Instanz von Data wird destruiert, dabei wird delete[] auf den Zeiger angewendet. Die neue Instanz hat den Zeiger aber noch und denkt, er wäre gültig. Das ist dann halt das Dilemma <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/1499291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499291</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 27 Apr 2008 21:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 06:44:40 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ist im Prinzip simpel: Wenn du mit push_back ein Element hinzufügst, muss u.U. (falls der vector nicht genug Speicher reserviert hat) neuer/größerer Speicher allokiert werden. Dazu werden die alten Elemente rüberkopiert (auf dem neuen Speicher wird für jedes alte Element der Copy-Constructor auf dem entsprechenden neuen Speicherstück aufgerufen, mit Parameter das Objekt auf dem alten Speicher). Dann wird der alte Speicher de-allokiert, vorher aber noch für jedes Element darauf der Destruktor aufgerufen, damit die Objekte wissen, dass sie weg sind.</p>
</blockquote>
<p>Really? I always thought that std::vector just copy memory byte-by-byte to the new location without calling copy-constructors and destructors. Such memory copying will significantly speed-up adding of new element and will avoid the case you mentioned in the last post (where absence of copy-constructor cause program error), because the buffer m_ptr points to will remain the same. The only limitation of such approach is that subobjects must not have pointers to the parent object.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499366</guid><dc:creator><![CDATA[SAn]]></dc:creator><pubDate>Mon, 28 Apr 2008 06:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 06:55:14 GMT]]></title><description><![CDATA[<p>SAn schrieb:</p>
<blockquote>
<p>Really? I always thought that std::vector just copy memory byte-by-byte to the new location without calling copy-constructors and destructors.</p>
</blockquote>
<p>Alle Container aus der Standardbibliothek die mit Objekten arbeiten, benutzen auch den Copy-Konstruktor und Destruktor. Wobei sie hier ggf. über den placement new Operator gehen (Container- und Implementierungsabhängig).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499371</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 28 Apr 2008 06:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 08:52:30 GMT]]></title><description><![CDATA[<p>Ich habe mich mal an einem copy Konstruktor versucht. Aber den kann ich nicht mit einem const versehen, dann compiliert es nämlich nicht.</p>
<pre><code class="language-cpp">ComplexBeam::ComplexBeam(ComplexBeam &amp; newBeam) 
{
	m_Dimensions = newBeam.Dimensions();
	m_DataSize = newBeam.Size();
	switch (m_Dimensions)
	{
		case 1: setSize(m_DataSize.width()); break;
		case 2: setSize(m_DataSize.width(), m_DataSize.height()); break;
	}
	newBeam.DataComplex(m_ComplexBeamData.Complex);
	m_DataWithPhase = false;
	m_DataWithAmplitude = false;
}
</code></pre>
<p>wie müssten den die anderen Operatoren aussehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499437</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Mon, 28 Apr 2008 08:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 09:04:09 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Ich habe mich mal an einem copy Konstruktor versucht. Aber den kann ich nicht mit einem const versehen, dann compiliert es nämlich nicht.</p>
</blockquote>
<p>Ach so, dann ist ja alles klar. Solltest du es inzwischen nicht so langsam mal mitbekommen haben, wie wichtig Fehlermeldungen sind?</p>
<p>Vermutlich ist ComplexBeam::Dimensions oder ComplexBeam::Size oder ComplexBeam::DataComplex nicht const.</p>
<p>Die Namensgebung &quot;newBeam&quot; ist übrigens unglücklich. Der Parameter ist das zu kopierende, also das &quot;alte&quot; Objekt. *this ist das neue.</p>
<p>pospiech schrieb:</p>
<blockquote>
<p>wie müssten den die anderen Operatoren aussehen?</p>
</blockquote>
<p><strong>denn</strong>!</p>
<p><a href="http://www.gotw.ca/gotw/059.htm" rel="nofollow">http://www.gotw.ca/gotw/059.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499448</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 28 Apr 2008 09:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 09:17:18 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>pospiech schrieb:</p>
<blockquote>
<p>Ich habe mich mal an einem copy Konstruktor versucht. Aber den kann ich nicht mit einem const versehen, dann compiliert es nämlich nicht.</p>
</blockquote>
<p>Ach so, dann ist ja alles klar. Solltest du es inzwischen nicht so langsam mal mitbekommen haben, wie wichtig Fehlermeldungen sind?</p>
<p>Vermutlich ist ComplexBeam::Dimensions oder ComplexBeam::Size oder ComplexBeam::DataComplex nicht const.</p>
</blockquote>
<p>ne const war gar keine, weil ich das noch nie gebraucht habe. Aber anscheint kann ich nicht alle zu const machen.</p>
<pre><code class="language-cpp">void ComplexBeam::DataComplex(complex&lt;double&gt;* OutputArray) const
{
	memcpy(OutputArray,m_ComplexBeamData.Complex,DataSizeComplex());
</code></pre>
<p>liefert mir die Fehlermeldung</p>
<blockquote>
<p>1&gt;.\src\complexbeam.cpp(374) : error C2662: 'ComplexBeam::DataSizeComplex': this-Zeiger kann nicht von 'const ComplexBeam' in 'ComplexBeam &amp;' konvertiert werden<br />
1&gt; Durch die Konvertierung gehen Qualifizierer verloren</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1499460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499460</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Mon, 28 Apr 2008 09:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to std:vector push_back deconstruiert meine Elemente on Mon, 28 Apr 2008 09:18:58 GMT]]></title><description><![CDATA[<p>Na dann mach doch ComplexBeam::DataSizeComplex auch const. Das solltest du mit allen Methoden tun, die dein Objekt nicht verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499461</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 28 Apr 2008 09:18:58 GMT</pubDate></item></channel></rss>