<?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[destruktive Destruktoren]]></title><description><![CDATA[<p>Hallo!<br />
Auch nach jahrelanger dilletantischer Gelegenheits-C++-Programmiererei begreife ich wohl immer noch nicht, wie wann warum Destruktoren aufgerufen werden. Jedenfalls machen die mir immer ganz unerwartet alles kaputt.</p>
<p>Die Klasse Neuron sieht in Auszügen so aus:</p>
<pre><code class="language-cpp">class Neuron
{
public:
	double *weight;
	bool initialized;
	bool stored;
	Link **input;
	int nInput;

	Neuron()
	{
		initialized=false;
		stored=false;
		input=NULL;
		weight=NULL;
		nInput=0;
	}
	Neuron(int size, Link **links, bool store)
	{
		nInput=size;
		if (store)
		{
			stored=true;
			input=new Link*[SIZE];
			memcpy(input, links, sizeof(Link *)*SIZE);
		}
		else
		{
			stored=false;
			input=links;
		}		
		weight=new double[nInput];
		printf(&quot;    Neuron(parameters)\n        weight address %d allocated\n&quot;, weight);
		initialized=true;
	}
	Neuron operator=(const Neuron &amp;other)
	{
		destroy();
		if (other.initialized)
		{
			nInput=other.nInput;
			if (other.stored)
			{
				stored=true;
				input=new Link*[SIZE];
				memcpy(input, other.input, sizeof(Link *)*SIZE);
			}
			else
			{
				stored=false;
				input=other.input;
			}
			weight=new double[nInput];
			printf(&quot;    operator=\n        weight address %d allocated\n&quot;, weight);
			memcpy(weight, other.weight, sizeof(double)*nInput);

			initialized=true;
		}
		return *this;
	}
	void destroy()
	{
		if (initialized)
		{
			if (weight!=NULL)
				delete[] weight;
			if (stored)
				delete[] input;
		}
		initialized=false;
		weight=NULL;
		stored=false;
		input=NULL;
		nInput=0;
	}
	~Neuron()
	{
		printf(&quot;    destructor\n        weight adress: %d\n&quot;, weight);
		destroy();
	}

};
</code></pre>
<p>Und hier wird sie benutzt:</p>
<pre><code class="language-cpp">// global definiert:
Neuron neurons[SIZE][SIZE];

// ... blah blah ...

// später dann irgendwo im Programm:
	for (int i=0; i&lt;SIZE; i++)
		for (int j=0; j&lt;SIZE; j++)
		{
		// ... blah ...
			printf(&quot;blah\n&quot;);
			neurons[i][j]=Neuron(SIZE*SIZE, links, false);
			printf(&quot;blub\n&quot;);
		// ... blah ...
		}
</code></pre>
<p>Das Problem ist jetzt, dass direkt nach &quot;neurons[i][j]=...&quot; offenbar der Destruktor für neurons[i][j] aufgerufen wird. Also nicht nur für den rechten Operanden, bei dem das ja klar ist.</p>
<p>Die Ausgabe an der Stelle ist:</p>
<pre><code>blah
    Neuron(parameters)
        weight address -2063630320 allocated
    operator=
         weight address -2063495152 allocated
    destructor
        weight adress: -2063495152
    destructor
        weight adress: -2063630320
    blub
</code></pre>
<p>Ich hab echt keine Ahnung, warum der Destruktor da gleich aufgerufen wird. Das macht doch keinen Sinn??<br />
Sorry für den langen Code-Abschnitt mit der Neuron-Klasse. Aber da muss ja wohl irgendwo der Fehler drin stecken und ich hab keine Ahnung, wo.</p>
<p>Grüße<br />
Krecik</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205017/destruktive-destruktoren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 20:25:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205017.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Feb 2008 14:37:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 14:37:06 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Auch nach jahrelanger dilletantischer Gelegenheits-C++-Programmiererei begreife ich wohl immer noch nicht, wie wann warum Destruktoren aufgerufen werden. Jedenfalls machen die mir immer ganz unerwartet alles kaputt.</p>
<p>Die Klasse Neuron sieht in Auszügen so aus:</p>
<pre><code class="language-cpp">class Neuron
{
public:
	double *weight;
	bool initialized;
	bool stored;
	Link **input;
	int nInput;

	Neuron()
	{
		initialized=false;
		stored=false;
		input=NULL;
		weight=NULL;
		nInput=0;
	}
	Neuron(int size, Link **links, bool store)
	{
		nInput=size;
		if (store)
		{
			stored=true;
			input=new Link*[SIZE];
			memcpy(input, links, sizeof(Link *)*SIZE);
		}
		else
		{
			stored=false;
			input=links;
		}		
		weight=new double[nInput];
		printf(&quot;    Neuron(parameters)\n        weight address %d allocated\n&quot;, weight);
		initialized=true;
	}
	Neuron operator=(const Neuron &amp;other)
	{
		destroy();
		if (other.initialized)
		{
			nInput=other.nInput;
			if (other.stored)
			{
				stored=true;
				input=new Link*[SIZE];
				memcpy(input, other.input, sizeof(Link *)*SIZE);
			}
			else
			{
				stored=false;
				input=other.input;
			}
			weight=new double[nInput];
			printf(&quot;    operator=\n        weight address %d allocated\n&quot;, weight);
			memcpy(weight, other.weight, sizeof(double)*nInput);

			initialized=true;
		}
		return *this;
	}
	void destroy()
	{
		if (initialized)
		{
			if (weight!=NULL)
				delete[] weight;
			if (stored)
				delete[] input;
		}
		initialized=false;
		weight=NULL;
		stored=false;
		input=NULL;
		nInput=0;
	}
	~Neuron()
	{
		printf(&quot;    destructor\n        weight adress: %d\n&quot;, weight);
		destroy();
	}

};
</code></pre>
<p>Und hier wird sie benutzt:</p>
<pre><code class="language-cpp">// global definiert:
Neuron neurons[SIZE][SIZE];

// ... blah blah ...

// später dann irgendwo im Programm:
	for (int i=0; i&lt;SIZE; i++)
		for (int j=0; j&lt;SIZE; j++)
		{
		// ... blah ...
			printf(&quot;blah\n&quot;);
			neurons[i][j]=Neuron(SIZE*SIZE, links, false);
			printf(&quot;blub\n&quot;);
		// ... blah ...
		}
</code></pre>
<p>Das Problem ist jetzt, dass direkt nach &quot;neurons[i][j]=...&quot; offenbar der Destruktor für neurons[i][j] aufgerufen wird. Also nicht nur für den rechten Operanden, bei dem das ja klar ist.</p>
<p>Die Ausgabe an der Stelle ist:</p>
<pre><code>blah
    Neuron(parameters)
        weight address -2063630320 allocated
    operator=
         weight address -2063495152 allocated
    destructor
        weight adress: -2063495152
    destructor
        weight adress: -2063630320
    blub
</code></pre>
<p>Ich hab echt keine Ahnung, warum der Destruktor da gleich aufgerufen wird. Das macht doch keinen Sinn??<br />
Sorry für den langen Code-Abschnitt mit der Neuron-Klasse. Aber da muss ja wohl irgendwo der Fehler drin stecken und ich hab keine Ahnung, wo.</p>
<p>Grüße<br />
Krecik</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452545</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Sat, 09 Feb 2008 14:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 14:45:35 GMT]]></title><description><![CDATA[<p>Dein Zuweisungsoperator gibt ein neues Objekt zurück, dazu wird der Copy-Ctor - den du nicht deklariert hast - aufgerufen. Dieser vom Compiler implizit generierte Ctor kopiert einfach jeden Member, das resultierende Objekt wird nach der Rückkehr aus dem Zuweisungsoperator nat. gleich wieder zerstört.<br />
Hier läuft ohnehin einiges falsch - wie copy-ctor und Zueweisungsoperator zu schreiben sind, ist regelmäßig Thema in diesem Forum, deshalb gehe hier nicht darauf ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452549</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 09 Feb 2008 14:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 14:57:33 GMT]]></title><description><![CDATA[<p>Krecik schrieb:</p>
<blockquote>
<p>...nach jahrelanger dilletantischer Gelegenheits-C++-Programmiererei...</p>
</blockquote>
<p>Ohne böse sein zu wollen, genau so sieht dein Code auch aus. Was willst du mit dieser Klasse eigenlich erreichen? Zudem scheinst du eine absolute Vorliebe für Zeigerarithmetik zu haben (womit du dir das Leben nur unnötig schwer machst).</p>
<p>Vielleicht kann man dir helfen in dem du mal beschreibst was du mit dieser Klasse erreichen willst (und Bitte: printf, public Membervariablen, memcpy [mit Ausnahme von Absoluten Sonderfällen] gehören nicht in sauberes C++). Zudem sollte ein Konstruktor immer einen sauberen Initialzustand haben (und warum verwendest du eine Methode destroy obwohl es in den Destruktor gehört?).</p>
<p>Ganz davon abgesehen: Der Destruktor wird am Ende der Lebenszeit aufgerufen (Sprich: falls du das Element lokal angelegt hast am Ende des Scopes und bei dynamischen beim delete). Die Membervariablen (sofern sie nicht statisch sind) werden dadurch ungültig, so das du diese auch nicht auf Initialwerte setzen musst. Zudem hat delete eine Automatische Prüfung gegen NULL, sofern du nicht anschließend mit dem Zeiger noch was anstellst kannst du dir somit sowohl das if, als auch das = NULL sparen.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452558</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 09 Feb 2008 14:57:33 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 15:04:20 GMT]]></title><description><![CDATA[<p>Wenn ich das ein bisschen zusammenfasse, komme ich ungefähr auf</p>
<pre><code class="language-cpp">class Neuron
{
public:
    typedef std::pair&lt; double, Link* &gt; link_type;
    typedef std::vector&lt; link_type &gt; links_type;
    links_type links;
    Neuron() : links() {}
    explicit Neuron(const links_type&amp; links)
        : links( links )
    {}
};
</code></pre>
<p>Hier passiert also nicht viel - kein Grund dafür 100 Zeilen fehlerhaften Code zu verschwenden.<br />
initialized und stored sind sowieso überflüssig, nInput korrespondier mit links.size()<br />
ich bin einfach mal davon ausgegangen, dass korrespondierende weight und Links-Elemente zusammengehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452565</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 09 Feb 2008 15:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 16:27:30 GMT]]></title><description><![CDATA[<p>achja und nicht vergessen wenn stored == true musst du auch deine input dinger da freigeben ... std::memcpy bei Klassen nicht nutzen! Usw. ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452584</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sat, 09 Feb 2008 16:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 16:58:37 GMT]]></title><description><![CDATA[<p>Krecik schrieb:</p>
<blockquote>
<p>bool initialized;</p>
</blockquote>
<p>Nicht destruktoren sind dein Problem, sondern generell Initialisierungen.<br />
Der Konstruktor sollte initialisieren, naemlich das was dein operator= und dein nicht Default-Konstruktor macht.</p>
<p>Indem du diese initialized-Variable wegwirfst, reduzierst du die Komplexitaet enorm.</p>
<p>Im Prinzip ist dein destroy() genau das was ein Destruktor macht - nur dass du eben mit dem initialized komplett gegen diese Mechanik arbeitest. Der Fehler in deinem Code liegt aber in der Verletzung der <a href="http://tutorial.schornboeck.net/bigthree.htm" rel="nofollow">Regel der grossen 3</a>.</p>
<p>Kleiner Tip:<br />
achte mal auf den Rueckgabetyp vom operator== <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/1452608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452608</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 09 Feb 2008 16:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 17:12:50 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Im Prinzip ist dein destroy() genau das was ein Destruktor macht - nur dass du eben mit dem initialized komplett gegen diese Mechanik arbeitest.</p>
</blockquote>
<p>Deswegen wohl auch destruktive Destruktoren im Topic <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452623</guid><dc:creator><![CDATA[konstruktiver User]]></dc:creator><pubDate>Sat, 09 Feb 2008 17:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sat, 09 Feb 2008 22:12:13 GMT]]></title><description><![CDATA[<p>sieht nach einem neuron in einem neuronalen netz aus, kleiner tipp<br />
wenn ein nulti-layer-perceptron werden soll, dann nimm als kleinste<br />
einheit eine ganze schicht, und nicht ein einzelnens neuron</p>
<p>hab auch mal versucht die struktur bis auf die einzelnen neuronen runterzubrechen, und glaub mir, das macht nur ärger ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452812</guid><dc:creator><![CDATA[Treb]]></dc:creator><pubDate>Sat, 09 Feb 2008 22:12:13 GMT</pubDate></item><item><title><![CDATA[Reply to destruktive Destruktoren on Sun, 10 Feb 2008 09:42:04 GMT]]></title><description><![CDATA[<p>Hmm, wo ist denn mein Beitrag von gestern geblieben? Hab ich den wohl gar nicht abgeschickt. Ärgerlich.<br />
Deshalb jetzt nur noch mal ganz kurz. Also, ich wollte eigentlich nur sagen: Vielen Dank für die Hilfe von allen. Hab einfach aus dem &quot;Neuron operator=&quot; ein &quot;Neuron &amp;operator=&quot; gemacht. Das hilft erst mal. Obwohl void natürlich auch geholfen hätte, zumal ich auch gar keinen Rückgabewert brauche. Ich hoffe, ich werd das mal im Kopf behalten, wie das funktioniert.<br />
Mein Programm werde ich wohl in die Tonne kloppen, weil ich eh kein Konzept hatte und von vornherein gar nicht wusste, was ich eigentlich vorhatte.<br />
Zu den Programmierstil-Belehrungen: Ich weiß, dass ich furchtbar schlechten Code schreibe. Aber da bin ich einfach ein hoffnungsloser Chaot. Trotzdem vielen Dank für die Ratschläge, von denen hoffentlich wenigstens ein kleiner Bruchteil nicht umsonst war und in meinem porösen Hirn einen Platz findet, den ich beizeiten wiederfinde. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
<p>Viele Grüße<br />
Unkraut</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452889</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Sun, 10 Feb 2008 09:42:04 GMT</pubDate></item></channel></rss>