<?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[tiefe objektkopien und löschen]]></title><description><![CDATA[<p>hi,</p>
<p>hab hier 2 klassen. eine Klasse Collection und ein Klasse Set, Collections kann mehrere Sets enthalten. Nun krieg ich aber ein &quot;doppel-löschen&quot;Fehler wenn die destruktoren aufgerufen werden und ich raffe einfach nicht wo der zu stande kommt.</p>
<p>hab mir für Set einen kopierkonstruktor erzeugt, der vom reinen testen der Set-Klasse her auch zu funktionieren scheint.</p>
<pre><code class="language-cpp">#ifndef COLLECTION_H
#define COLLECTION_H
#include &quot;Set.h&quot;

class Collection
{
public:
	Collection();
	~Collection();
	void add(Set s);
	void print();
private:
	void resize();
	Set * m_member;
	int   m_count;
	int   CUR_MAX;

};

#endif
------------
Collection::Collection():m_member(0),m_count(0), CUR_MAX(10)
{
	m_member = new Set[CUR_MAX];
}

void Collection::add(Set s)
{	
	if (m_count == CUR_MAX)
		resize();

	m_member[m_count++] = s;
}

void Collection::resize()
{
	printf(&quot;Collection resize\n&quot;);
	Set *temp = new Set[CUR_MAX * 2];

	for (int i=0; i &lt; m_count; i++)
		temp[i] = m_member[i];

	//delete m_member;

	CUR_MAX *= 2;

	m_member = temp;
	temp = 0;
}

Collection::~Collection()
{	

	if (m_member != 0)
	{
		printf(&quot;Collection Destruktor\n&quot;);
		delete [] m_member;
		m_member = 0;
	}
}
</code></pre>
<p>Set</p>
<pre><code class="language-cpp">#ifndef SET_H
#define SET_H

#include &lt;stdarg.h&gt;
#include &lt;stdio.h&gt;

class Set
{
public:
	Set();
	~Set();
	Set(const Set &amp;s);
	Set(int i, ...);
	//Set operator = (const Set s);
	void print();
private:
	int * m_member; //Pointer auf Mengenarray
	int   m_count;  //Anzahl Elemente der Menge
};

#endif
-------------------
#include &quot;Set.h&quot;

Set::Set():m_member(0), m_count(0)
{
}

Set::Set(int c, ...)
{
	m_count = c;

	va_list vl;
	va_start(vl, c);

	m_member = new int[c];

	for(int i=0; i &lt; c; i++)
		m_member[i] = va_arg(vl, int);

	va_end(vl);
}

Set::Set(const Set &amp;s)
{
	this-&gt;m_count = s.m_count;
	this-&gt;m_member = new int[s.m_count];

	for(int i=0; i &lt; m_count; i++)
		this-&gt;m_member[i] = s.m_member[i];
}

Set::~Set()
{
	if (m_member != 0)
	{
		printf(&quot;Set Destruktor\n&quot;);
		delete [] m_member;
     	m_member = 0;
	}
}
</code></pre>
<pre><code class="language-cpp">#include &quot;Set.h&quot;
#include &quot;Collection.h&quot;

int main (int argc, char * const argv[]) 
{
    Set a(8, 10,20,30,40,50,60,70,80);

	Collection coll;
	coll.add(a);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/227094/tiefe-objektkopien-und-löschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227094.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Nov 2008 19:07:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 19:07:39 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>hab hier 2 klassen. eine Klasse Collection und ein Klasse Set, Collections kann mehrere Sets enthalten. Nun krieg ich aber ein &quot;doppel-löschen&quot;Fehler wenn die destruktoren aufgerufen werden und ich raffe einfach nicht wo der zu stande kommt.</p>
<p>hab mir für Set einen kopierkonstruktor erzeugt, der vom reinen testen der Set-Klasse her auch zu funktionieren scheint.</p>
<pre><code class="language-cpp">#ifndef COLLECTION_H
#define COLLECTION_H
#include &quot;Set.h&quot;

class Collection
{
public:
	Collection();
	~Collection();
	void add(Set s);
	void print();
private:
	void resize();
	Set * m_member;
	int   m_count;
	int   CUR_MAX;

};

#endif
------------
Collection::Collection():m_member(0),m_count(0), CUR_MAX(10)
{
	m_member = new Set[CUR_MAX];
}

void Collection::add(Set s)
{	
	if (m_count == CUR_MAX)
		resize();

	m_member[m_count++] = s;
}

void Collection::resize()
{
	printf(&quot;Collection resize\n&quot;);
	Set *temp = new Set[CUR_MAX * 2];

	for (int i=0; i &lt; m_count; i++)
		temp[i] = m_member[i];

	//delete m_member;

	CUR_MAX *= 2;

	m_member = temp;
	temp = 0;
}

Collection::~Collection()
{	

	if (m_member != 0)
	{
		printf(&quot;Collection Destruktor\n&quot;);
		delete [] m_member;
		m_member = 0;
	}
}
</code></pre>
<p>Set</p>
<pre><code class="language-cpp">#ifndef SET_H
#define SET_H

#include &lt;stdarg.h&gt;
#include &lt;stdio.h&gt;

class Set
{
public:
	Set();
	~Set();
	Set(const Set &amp;s);
	Set(int i, ...);
	//Set operator = (const Set s);
	void print();
private:
	int * m_member; //Pointer auf Mengenarray
	int   m_count;  //Anzahl Elemente der Menge
};

#endif
-------------------
#include &quot;Set.h&quot;

Set::Set():m_member(0), m_count(0)
{
}

Set::Set(int c, ...)
{
	m_count = c;

	va_list vl;
	va_start(vl, c);

	m_member = new int[c];

	for(int i=0; i &lt; c; i++)
		m_member[i] = va_arg(vl, int);

	va_end(vl);
}

Set::Set(const Set &amp;s)
{
	this-&gt;m_count = s.m_count;
	this-&gt;m_member = new int[s.m_count];

	for(int i=0; i &lt; m_count; i++)
		this-&gt;m_member[i] = s.m_member[i];
}

Set::~Set()
{
	if (m_member != 0)
	{
		printf(&quot;Set Destruktor\n&quot;);
		delete [] m_member;
     	m_member = 0;
	}
}
</code></pre>
<pre><code class="language-cpp">#include &quot;Set.h&quot;
#include &quot;Collection.h&quot;

int main (int argc, char * const argv[]) 
{
    Set a(8, 10,20,30,40,50,60,70,80);

	Collection coll;
	coll.add(a);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1612899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612899</guid><dc:creator><![CDATA[adsfsdfsdf]]></dc:creator><pubDate>Mon, 10 Nov 2008 19:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 20:17:05 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-1819.html" rel="nofollow">rüdiger</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-5.html" rel="nofollow">Linux/Unix</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612932</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 10 Nov 2008 20:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 20:36:47 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Collection::resize()
{
    printf(&quot;Collection resize\n&quot;);
    Set *temp = new Set[CUR_MAX * 2];

    for (int i=0; i &lt; m_count; i++)
        temp[i] = m_member[i];

    //delete m_member;

    CUR_MAX *= 2;

    m_member = temp;
    temp = 0;
}
</code></pre>
<p>Ohne das delete hast schonmal n fettes Speicherleck drin, außerdem solltest ein Array ja auch mittels delete [] m_member entfernen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612942</guid><dc:creator><![CDATA[Paul Manns]]></dc:creator><pubDate>Mon, 10 Nov 2008 20:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 21:05:32 GMT]]></title><description><![CDATA[<p>Du musst auch einen assignment-operator für &quot;Set&quot; implementieren.<br />
Für Collection ebenso.<br />
Oder du verwendest einfach std::vector und std::set (oder was auch immer an Stelle von &quot;Set&quot; von der STL verwendet werden kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612956</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 10 Nov 2008 21:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 22:07:42 GMT]]></title><description><![CDATA[<p>ich hab jetzt eine sehr unbefriedigenden work-around gefunden mit viel overhead und sinnlosen objekt erzeugen, aber es funktioniert ohne gelöschte sachen erneut zu löschen.</p>
<p>Wenn ich mit add ein Objekt zur Kollektion hinzufügen will, dann wird der Kopierkonstruktor aufgerufen. So das ich eigentlich eine Kopie haben sollte (seltsamer weise hab ich das aber nicht), wird das stack-objekt gelöscht, löscht sich auch der inhal meinr vermeintlichen kopie mit.</p>
<p>Hab mir dazu eine neuen Konstruktor gemacht (Pseudo-Kopierkonstruktor), den ich in der add Methode erneut aufrufe und dann als Pointer sichere.</p>
<p>Hier mal die Methoden:</p>
<pre><code class="language-cpp">Set::Set(int c, Set s)
{
	m_count = c;

	m_elements = new int[c];

	for(int i=0; i &lt; c; i++)
		m_elements[i] = s.getElement(i);

}

Set::Set(const Set &amp;s)
{
	printf(&quot;Erzeuge Referenz Objektkopie von Set\n&quot;);
	this-&gt;m_count = s.m_count;
	this-&gt;m_elements = new int[s.m_count];

	for(int i=0; i &lt; s.m_count; i++)
		this-&gt;m_elements[i] = s.m_elements[i];
}

void Collection::add(Set s)
{	
	if (m_sets == 0)
		m_sets = new Set[CUR_MAX];

	if (m_count == CUR_MAX)
		resize();

	m_sets[m_count++] = *(new Set(s.getCount(), s));
	//m_sets[m_count++] = s;
}
</code></pre>
<p>Es funktioniert so, aber ich versteh zum verrecken nicht was an diesem doofen Kopierkonstruktor nicht funktioniert. Mein Pseudo-Kopierkonstruktor macht afaik das selbe.....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612972</guid><dc:creator><![CDATA[sdfsdf]]></dc:creator><pubDate>Mon, 10 Nov 2008 22:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 22:19:22 GMT]]></title><description><![CDATA[<p>hm, ok.</p>
<p>Mit Assignmentoperator gehts.....aber ich versteh nicht ganz wieso?</p>
<p>Meine Printf-Anweisungen sagen mir, dass sowohl Kopierkonsturktor, als auch AssignmentOperator-Methode aufgerufen werden.</p>
<p>ist das dann nicht doppelt gemoppelt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612975</guid><dc:creator><![CDATA[asdfsdf]]></dc:creator><pubDate>Mon, 10 Nov 2008 22:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to tiefe objektkopien und löschen on Mon, 10 Nov 2008 23:07:35 GMT]]></title><description><![CDATA[<p>asdfsdf schrieb:</p>
<blockquote>
<p>Meine Printf-Anweisungen sagen mir, dass sowohl Kopierkonsturktor, als auch AssignmentOperator-Methode aufgerufen werden.</p>
<p>ist das dann nicht doppelt gemoppelt?</p>
</blockquote>
<p>Ohne jetzt deinen Code genau durchgelesen zu haben: du übergibst die Sets als Wert, wo eine const-Referenz reichen würde. Da wird also auch nochmal überflüssigerweise kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1612985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1612985</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Mon, 10 Nov 2008 23:07:35 GMT</pubDate></item></channel></rss>