<?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[(Verständnis)Probleme mit Zuweisungsoperator überladen]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Folgendes Problem: Da ich demnächst öfter mit (TXT)Bildern hantieren muss, wollte ich mir eine kleine Klasse schreiben, die mir das Laden, Speichern und Verarbeiten erleichtert.<br />
Es soll zum Beispiel auch möglich sein die Bildwerte verschiedener Bilder zu addieren oder auch den einen Bild die Werte eines anderen zuzuweisen, es also zu überschreiben.</p>
<p>Aus diesem Grund wollte ich den Zuweisungsoperator überladen. Aber anscheinend kommt es da zu Problemen die zum Absturz des Programms führen (&quot;Unbehandelte Ausnahme...&quot;)</p>
<p>Hier erstmal der grobe Quellcode des Programms in der main.cpp. dataIn und dataBuffer sind jeweils vom Typ int**.</p>
<pre><code class="language-cpp">...
Bild.LoadTXTImg(name2,640,480);
dataIn=Bild.GetDataPtr();
if (Bild.CheckValid())
{
	Buffer=Bild;
	dataBuffer=Buffer.GetDataPtr();
}
else cout &lt;&lt; &quot;Bild &quot; &lt;&lt; name2 &lt;&lt; &quot; nicht gefunden!&quot; &lt;&lt; endl;

Bild.Delete();		

Buffer.SaveTXTImg(name3);
Buffer.Delete();
...
</code></pre>
<p>Der Absturz kommt in &quot;Buffer.SaveTXTImg(name3);&quot;. Diese Funktion sieht wie folgt aus:</p>
<pre><code class="language-cpp">void Image::SaveTXTImg(char C[])
{
	cout &lt;&lt; &quot;SaveTXTImg...&quot; &lt;&lt; endl;
	ofstream file;
	int i=0, j=0;

	file.open(C);

	if (file.good() &amp;&amp; valid)
	{
		for (j=0;j&lt;size_y;j++)
		{
			for (i=0;i&lt;size_x;i++)
			{				
				file &lt;&lt; data[i][j] &lt;&lt; &quot;\t&quot;;
			}
			file &lt;&lt; endl;
		}
	}
	else
	{
		cout &lt;&lt; &quot;Datei konnte nicht geschrieben werden...&quot; &lt;&lt; endl;
	}

	file.close();
}
</code></pre>
<p>Zum Absturz kommt es, da in den data[i][j] dann anscheinend nur noch Müll steht (zB -17891602).<br />
Das lustige ist eben, dass wenn ich in der main.cpp die Zeile &quot;Bild.Delete();&quot; weglasse, bzw. nach den Speichervorgang setze kein Problem habe.</p>
<p>Delete() sieht dabei wie folgt aus:</p>
<pre><code class="language-cpp">void Image::Delete()
{
	cout &lt;&lt; &quot;Delete...&quot; &lt;&lt; endl;
	int i;

	if (valid)
	{
		for (i=0;i&lt;size_x;i++)
		{
			free(this-&gt;data[i]);
		}
		free(this-&gt;data);
		this-&gt;data=NULL;
		this-&gt;valid = false;
	}
}
</code></pre>
<p>Es scheint also so, als ob mit &quot;Buffer = Bild;&quot; irgendwas schief läuft und die Daten dann doch nicht mehr vorhanden sind!</p>
<p>Hier mein Zuweisungsoperator:</p>
<pre><code class="language-cpp">Image &amp;Image::operator=(const Image &amp;A)
{
	int i=0;
	cout &lt;&lt; &quot;Operator=...&quot; &lt;&lt; endl;
	this-&gt;valid=A.valid;
	this-&gt;size_x=A.size_x;
	this-&gt;size_y=A.size_y;

	if (A.data!=NULL) 
	{
		this-&gt;data = (int**) malloc (sizeof(int*)*size_x);
		for (i=0;i&lt;size_x;i++) data[i]=(int*)malloc(sizeof(int)*size_y);

		memcpy(this-&gt;data,A.data,sizeof(int*)*size_x*size_y);
	}
	else data=NULL;

	return *this;
}
</code></pre>
<p>Aber ich kopiere mit memcpy doch die Daten aus &quot;Bild&quot; in einen neuen Speicherbereich für &quot;Buffer&quot;, oder?</p>
<p>Ich hoffe ich konnte mein Problem verständlich machen...</p>
<p>Ich würde mich über euere Hilfe sehr freuen! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/269654/verständnis-probleme-mit-zuweisungsoperator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 01:22:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269654.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jun 2010 07:30:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 07:30:33 GMT]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Folgendes Problem: Da ich demnächst öfter mit (TXT)Bildern hantieren muss, wollte ich mir eine kleine Klasse schreiben, die mir das Laden, Speichern und Verarbeiten erleichtert.<br />
Es soll zum Beispiel auch möglich sein die Bildwerte verschiedener Bilder zu addieren oder auch den einen Bild die Werte eines anderen zuzuweisen, es also zu überschreiben.</p>
<p>Aus diesem Grund wollte ich den Zuweisungsoperator überladen. Aber anscheinend kommt es da zu Problemen die zum Absturz des Programms führen (&quot;Unbehandelte Ausnahme...&quot;)</p>
<p>Hier erstmal der grobe Quellcode des Programms in der main.cpp. dataIn und dataBuffer sind jeweils vom Typ int**.</p>
<pre><code class="language-cpp">...
Bild.LoadTXTImg(name2,640,480);
dataIn=Bild.GetDataPtr();
if (Bild.CheckValid())
{
	Buffer=Bild;
	dataBuffer=Buffer.GetDataPtr();
}
else cout &lt;&lt; &quot;Bild &quot; &lt;&lt; name2 &lt;&lt; &quot; nicht gefunden!&quot; &lt;&lt; endl;

Bild.Delete();		

Buffer.SaveTXTImg(name3);
Buffer.Delete();
...
</code></pre>
<p>Der Absturz kommt in &quot;Buffer.SaveTXTImg(name3);&quot;. Diese Funktion sieht wie folgt aus:</p>
<pre><code class="language-cpp">void Image::SaveTXTImg(char C[])
{
	cout &lt;&lt; &quot;SaveTXTImg...&quot; &lt;&lt; endl;
	ofstream file;
	int i=0, j=0;

	file.open(C);

	if (file.good() &amp;&amp; valid)
	{
		for (j=0;j&lt;size_y;j++)
		{
			for (i=0;i&lt;size_x;i++)
			{				
				file &lt;&lt; data[i][j] &lt;&lt; &quot;\t&quot;;
			}
			file &lt;&lt; endl;
		}
	}
	else
	{
		cout &lt;&lt; &quot;Datei konnte nicht geschrieben werden...&quot; &lt;&lt; endl;
	}

	file.close();
}
</code></pre>
<p>Zum Absturz kommt es, da in den data[i][j] dann anscheinend nur noch Müll steht (zB -17891602).<br />
Das lustige ist eben, dass wenn ich in der main.cpp die Zeile &quot;Bild.Delete();&quot; weglasse, bzw. nach den Speichervorgang setze kein Problem habe.</p>
<p>Delete() sieht dabei wie folgt aus:</p>
<pre><code class="language-cpp">void Image::Delete()
{
	cout &lt;&lt; &quot;Delete...&quot; &lt;&lt; endl;
	int i;

	if (valid)
	{
		for (i=0;i&lt;size_x;i++)
		{
			free(this-&gt;data[i]);
		}
		free(this-&gt;data);
		this-&gt;data=NULL;
		this-&gt;valid = false;
	}
}
</code></pre>
<p>Es scheint also so, als ob mit &quot;Buffer = Bild;&quot; irgendwas schief läuft und die Daten dann doch nicht mehr vorhanden sind!</p>
<p>Hier mein Zuweisungsoperator:</p>
<pre><code class="language-cpp">Image &amp;Image::operator=(const Image &amp;A)
{
	int i=0;
	cout &lt;&lt; &quot;Operator=...&quot; &lt;&lt; endl;
	this-&gt;valid=A.valid;
	this-&gt;size_x=A.size_x;
	this-&gt;size_y=A.size_y;

	if (A.data!=NULL) 
	{
		this-&gt;data = (int**) malloc (sizeof(int*)*size_x);
		for (i=0;i&lt;size_x;i++) data[i]=(int*)malloc(sizeof(int)*size_y);

		memcpy(this-&gt;data,A.data,sizeof(int*)*size_x*size_y);
	}
	else data=NULL;

	return *this;
}
</code></pre>
<p>Aber ich kopiere mit memcpy doch die Daten aus &quot;Bild&quot; in einen neuen Speicherbereich für &quot;Buffer&quot;, oder?</p>
<p>Ich hoffe ich konnte mein Problem verständlich machen...</p>
<p>Ich würde mich über euere Hilfe sehr freuen! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1918723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918723</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Tue, 29 Jun 2010 07:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 08:31:05 GMT]]></title><description><![CDATA[<p>ob das so mit memcpy funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    />, glaube mal nicht, weil die Zeiger ja irgendwo hinzeigen <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="😉"
    /> Ich würde jede y-Zeile extra kopieren.<br />
also:</p>
<pre><code>memcpy(this-&gt;data[i],A.data[i],size_y*sizeof(int));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1918749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918749</guid><dc:creator><![CDATA[RR]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 08:32:50 GMT]]></title><description><![CDATA[<p>Warum um alles in der Welt benutzt du in einem C++-Programm malloc und free?</p>
<p>Dieses Codestück ist unabhängig davon falsch:</p>
<pre><code>for (i=0;i&lt;size_x;i++) data[i]=(int*)malloc(sizeof(int)*size_y);

        memcpy(this-&gt;data,A.data,sizeof(int*)*size_x*size_y);
</code></pre>
<p>Du legst size_x mal sizeof(int)*size_y große Blöcke im Speicher an, und erwartest das sie alle hintereinander liegen, wenn du den Inhalt kopierst. Das funktioniert nicht.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918751</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 08:36:48 GMT]]></title><description><![CDATA[<p>Ich bin mir sicher, mit einer etwas abstrakteren Herangehensweise könntest du viele Probleme beseitigen und hättest dazu noch weniger Code. Warum <code>malloc()</code> und <code>free()</code> , wenn wir in C++ <code>std::vector</code> (oder <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">andere Containerklassen</a>) haben? Wahrscheinlich müsstest du nicht einmal den Zuweisungsoperator selbst überladen und hättest Dinge wie Exceptionsicherheit, garantierte Speicherfreigabe und hohe Performance gratis, während du momentan mit Memory Leaks zu kämpfen hast.</p>
<p>Ich stelle mir das so vor:</p>
<pre><code class="language-cpp">class Image
{
    public:
        // Erzeugt leeres Bild mit Abmessungen 0*0 Pixel
        Image();

        // Lädt Bild aus Datei (ruft LoadFromFile() auf)
        Image(const std::string&amp; filename);

        // Erzeugt leeres Bild mit Breite und Höhe
        Image(unsigned int width, unsigned int height);

        // Lädt Bild aus Datei
        void LoadFromFile(const std::string&amp; filename);

        // Speichert Bild in Datei
        void SaveToFile(const std::string&amp; filename);

        // Gibt Bildbreite zurück
        unsigned int GetWidth() const;

        // Gibt Bildhöhe zurück
        unsigned int GetHeight() const;

        // Dinge wie delete oder operator= sind unnötig
        ...

    private:
        std::vector&lt;int&gt; data; // 2D- auf 1D-Array abbilden
        unsigned int myWidth;
};
</code></pre>
<p>Wenn du keine Exceptions verwenden möchtest, kannst du auch <code>bool</code> -Rückgaben verwenden (dann musst du eben auf Konstruktoren, die potentiell fehlschlagen, verzichten). Aber bitte nicht C-Konstrukte wie <code>Delete()</code> , bei deren Vergessen undefiniertes Verhalten oder Memory Leaks entstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918753</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 08:41:29 GMT]]></title><description><![CDATA[<p>Ok...</p>
<p>Also vielen Dank erstmal für euere Hilfe!<br />
malloc() und free() verwende ich einfach nur, weil ich es sozusagen nicht besser weiß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ich brauchte ein Array mit dynamischer Größe und hab das mit rudimentären C-Kenntnissen so zusammen geschustert.</p>
<p>Zu meiner Schande muss ich gestehen, dass ich bis jetzt noch nicht wirkicht mit std::vector zu tun hatte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Werde das aber schleunigst nachholen...</p>
<p>Ich glaube also, dass sich das Problem geklärt hätte.<br />
Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1918754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918754</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to (Verständnis)Probleme mit Zuweisungsoperator überladen on Tue, 29 Jun 2010 08:46:48 GMT]]></title><description><![CDATA[<p>In meinem Post gibt es einen Link, dort findest du eine gute Einführung in die STL. <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>Und zur Dokumentation/Referenz der Standardbibliothek kannst du <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a> verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918759</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:46:48 GMT</pubDate></item></channel></rss>