<?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[Code erzeugt speicherleck *frust*]]></title><description><![CDATA[<p>moin,<br />
ich bin grad dabei ein programm zu schreiben, leider erzeugt der code anscheinend ein speicherleck, obwohl ich alle temporären variablen lösche, bzw. versuche zu löschen.<br />
Bei dem Programm handelt sich um ein Objektbasierendem Zeichenprogramm, mit etwas anderen ansprüchen als an Beispielsweise MSPaint. Die einzelnen Objekte werden in einem CObArray gespeichert.<br />
Den Folgenden Code rufe ich beim Zeichnen einen neues Objektes, bzw. beim Neu Zeichnen des Fensters auf.<br />
[edit]als anmerkung, das programm ist dialogfeld-basierend und ich verwende visual c++ 6.0[/edit]</p>
<pre><code class="language-cpp">void CSkizzenIIDlg::ZeichneObjektNr(int iNr)
{
	CClientDC dc(this);
	CObjekte* Objekt = new CObjekte(); //eine von CObject abgeleitet Klasse
	Objekt = (CObjekte*) m_coaObjekte.GetAt(iNr);; //eine CObArray variable

	//Brush
	CBrush brush;
	//Farbe[0] = Vordergrund; Farbe[1] = Hintergrund
	//Farbe[x][0] = Rot; Farbe[x][1] = Grün; Farbe[x][2] = Blau
	brush.CreateHatchBrush(HS_DIAGCROSS, RGB(Objekt-&gt;m_bFarbe[0][0], Objekt-&gt;m_bFarbe[0][1], Objekt-&gt;m_bFarbe[0][2]));

	//Pen
	CPen pen;
	pen.CreatePen(PS_DOT, 1, RGB(Objekt-&gt;m_bFarbe[0][0], Objekt-&gt;m_bFarbe[0][1], Objekt-&gt;m_bFarbe[0][2]));
	dc.SelectObject(&amp;pen);

	//2. Farbe (Hintergrund)
	dc.SetBkColor(RGB(Objekt-&gt;m_bFarbe[1][0], Objekt-&gt;m_bFarbe[1][1], Objekt-&gt;m_bFarbe[1][2]));

	CRect rect;
	rect.left = Objekt-&gt;m_iKoords[0]; //Koords[0] = x-Achse; Koords[1] = y-Achse
	rect.right = Objekt-&gt;m_iKoords[0] + Objekt-&gt;m_iGroesse[0];
	rect.top = Objekt-&gt;m_iKoords[1];
	rect.bottom = Objekt-&gt;m_iKoords[1] + Objekt-&gt;m_iGroesse[1];

	switch(Objekt-&gt;m_iTyp) //m_iTyp gibt an ob Linie, Rechteck... gezeichnet werden soll
	{
	case 0:
		//Linie (gestrichelt)
		dc.MoveTo(rect.left, rect.top);
		dc.LineTo(rect.right, rect.bottom);
		break;
	case 1:
		//Rechteck (gemustert)
		dc.FillRect(rect, &amp;brush);
		break;
	case 2:
		//Ellipse
		dc.SelectObject(&amp;brush);
		dc.Ellipse(rect);
		break;
	case 3:
		//Rahmen (Rechteck)
		dc.FrameRect(rect, &amp;brush);
		break;
	}
	//Temporäre Objekte löschen
	pen.DeleteObject();
	brush.DeleteObject();
	dc.DeleteTempMap(); //dc.DeleteDC führt zum Absturz des Programmes
}
</code></pre>
<p>Danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/72189/code-erzeugt-speicherleck-frust</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 10:12:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/72189.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Apr 2004 10:30:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Code erzeugt speicherleck *frust* on Mon, 26 Apr 2004 10:38:50 GMT]]></title><description><![CDATA[<p>moin,<br />
ich bin grad dabei ein programm zu schreiben, leider erzeugt der code anscheinend ein speicherleck, obwohl ich alle temporären variablen lösche, bzw. versuche zu löschen.<br />
Bei dem Programm handelt sich um ein Objektbasierendem Zeichenprogramm, mit etwas anderen ansprüchen als an Beispielsweise MSPaint. Die einzelnen Objekte werden in einem CObArray gespeichert.<br />
Den Folgenden Code rufe ich beim Zeichnen einen neues Objektes, bzw. beim Neu Zeichnen des Fensters auf.<br />
[edit]als anmerkung, das programm ist dialogfeld-basierend und ich verwende visual c++ 6.0[/edit]</p>
<pre><code class="language-cpp">void CSkizzenIIDlg::ZeichneObjektNr(int iNr)
{
	CClientDC dc(this);
	CObjekte* Objekt = new CObjekte(); //eine von CObject abgeleitet Klasse
	Objekt = (CObjekte*) m_coaObjekte.GetAt(iNr);; //eine CObArray variable

	//Brush
	CBrush brush;
	//Farbe[0] = Vordergrund; Farbe[1] = Hintergrund
	//Farbe[x][0] = Rot; Farbe[x][1] = Grün; Farbe[x][2] = Blau
	brush.CreateHatchBrush(HS_DIAGCROSS, RGB(Objekt-&gt;m_bFarbe[0][0], Objekt-&gt;m_bFarbe[0][1], Objekt-&gt;m_bFarbe[0][2]));

	//Pen
	CPen pen;
	pen.CreatePen(PS_DOT, 1, RGB(Objekt-&gt;m_bFarbe[0][0], Objekt-&gt;m_bFarbe[0][1], Objekt-&gt;m_bFarbe[0][2]));
	dc.SelectObject(&amp;pen);

	//2. Farbe (Hintergrund)
	dc.SetBkColor(RGB(Objekt-&gt;m_bFarbe[1][0], Objekt-&gt;m_bFarbe[1][1], Objekt-&gt;m_bFarbe[1][2]));

	CRect rect;
	rect.left = Objekt-&gt;m_iKoords[0]; //Koords[0] = x-Achse; Koords[1] = y-Achse
	rect.right = Objekt-&gt;m_iKoords[0] + Objekt-&gt;m_iGroesse[0];
	rect.top = Objekt-&gt;m_iKoords[1];
	rect.bottom = Objekt-&gt;m_iKoords[1] + Objekt-&gt;m_iGroesse[1];

	switch(Objekt-&gt;m_iTyp) //m_iTyp gibt an ob Linie, Rechteck... gezeichnet werden soll
	{
	case 0:
		//Linie (gestrichelt)
		dc.MoveTo(rect.left, rect.top);
		dc.LineTo(rect.right, rect.bottom);
		break;
	case 1:
		//Rechteck (gemustert)
		dc.FillRect(rect, &amp;brush);
		break;
	case 2:
		//Ellipse
		dc.SelectObject(&amp;brush);
		dc.Ellipse(rect);
		break;
	case 3:
		//Rahmen (Rechteck)
		dc.FrameRect(rect, &amp;brush);
		break;
	}
	//Temporäre Objekte löschen
	pen.DeleteObject();
	brush.DeleteObject();
	dc.DeleteTempMap(); //dc.DeleteDC führt zum Absturz des Programmes
}
</code></pre>
<p>Danke im Voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/508942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/508942</guid><dc:creator><![CDATA[Emperor_L0ser]]></dc:creator><pubDate>Mon, 26 Apr 2004 10:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Code erzeugt speicherleck *frust* on Mon, 26 Apr 2004 10:39:17 GMT]]></title><description><![CDATA[<p>Emperor_L0ser schrieb:</p>
<blockquote>
<pre><code class="language-cpp">CObjekte* Objekt = new CObjekte(); //eine von CObject abgeleitet Klasse
}
</code></pre>
</blockquote>
<p>Du musst nacher noch &quot;delete Objekt;&quot; aufrufen.</p>
<p>Grüße Rapha</p>
]]></description><link>https://www.c-plusplus.net/forum/post/508947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/508947</guid><dc:creator><![CDATA[Rapha]]></dc:creator><pubDate>Mon, 26 Apr 2004 10:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to Code erzeugt speicherleck *frust* on Mon, 26 Apr 2004 10:51:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>da stimmt mehreres nicht.</p>
<p>Rapha hat schon recht, aber das eigentliche Problem ist das hier:</p>
<pre><code class="language-cpp">CObjekte* Objekt = new CObjekte(); //eine von CObject abgeleitet Klasse
    Objekt = (CObjekte*) m_coaObjekte.GetAt(iNr);; //eine CObArray variable
</code></pre>
<p>es bewirkt, daß Speicher mit new angefordert wird, aber der sofort in der &quot;Luft hängt&quot;, wenn Objekt danach sowieso ein Objekt-Zeiger aus dem CObArray zugewiesen wird.</p>
<p>Desweiteren: es ist verboten, noch in den Gerätekontext eingesetzte GDI-Objekte mit DeleteObject zu löschen:</p>
<pre><code class="language-cpp">pen.DeleteObject();
    brush.DeleteObject();
</code></pre>
<p>MSDN schrieb:</p>
<blockquote>
<p>An application should not call DeleteObject on a CGdiObject object that is currently selected into a device context.</p>
</blockquote>
<p>der CPen und der CBrush werden schon vom Destruktor ordentlich entsorgt, so daß keinerlei Löschen nötig ist.</p>
<p>Außerdem sollten die vorher in den Gerätekontext eingesetzten Objekte beim Einsetzen der neuen gesichert und vor dem Verlassen der Funktion wieder eingesetzt werden</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/508959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/508959</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Mon, 26 Apr 2004 10:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Code erzeugt speicherleck *frust* on Mon, 26 Apr 2004 11:10:23 GMT]]></title><description><![CDATA[<p>hmm.. ich habe meinen code jetzt wie folgt geändert</p>
<pre><code class="language-cpp">CClientDC dc(this);
    CObjekte* Objekt; // = new CObjekte(); //eine von CObject abgeleitet Klasse
    Objekt = (CObjekte*) m_coaObjekte.GetAt(iNr);; //eine CObArray variable
/*
* und
*/

    //Temporäre Objekte löschen
    //pen.DeleteObject();
    //brush.DeleteObject();
    //dc.DeleteTempMap(); //dc.DeleteDC führt zum Absturz des Programmes
    delete Objekt;
</code></pre>
<p>Das mit dem speicher anfordern stimmt ja auch... <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="🤡"
    /><br />
es funktioniert auch, so lange ich nur ein neues objekt hinzufüge, wenn ich jedoch alles neu zeichnen (z.b. bei größenänderung des fensters) stürzt mein programm ab.<br />
mit folgendem code lasse ich alle objekte neu zeichnen</p>
<pre><code class="language-cpp">void CSkizzenIIDlg::ZeichneObjekte()
{
	if(m_coaObjekte.GetSize() &gt; 0)
	{
		for(int i = 0; i &lt; m_coaObjekte.GetSize(); i++)
		{
			ZeichneObjektNr(i);
		}
	}
}
</code></pre>
<p>ist also nichts weiter dran.<br />
kann es sein, da 'CObjekt* Objekt;' nur ein zeiger ist, dass ich mit delete Objekt jedesmal ein teil meines Arrays lösche?</p>
<p>Probe-Nutzer schrieb:</p>
<blockquote>
<p>Außerdem sollten die vorher in den Gerätekontext eingesetzten Objekte beim Einsetzen der neuen gesichert und vor dem Verlassen der Funktion wieder eingesetzt werden</p>
</blockquote>
<p>den teil versteh ich vom sinn her nicht, was soll wo gesichert werden? O.o</p>
]]></description><link>https://www.c-plusplus.net/forum/post/508970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/508970</guid><dc:creator><![CDATA[Emperor_L0ser]]></dc:creator><pubDate>Mon, 26 Apr 2004 11:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Code erzeugt speicherleck *frust* on Mon, 26 Apr 2004 12:16:12 GMT]]></title><description><![CDATA[<p>Emperor_L0ser schrieb:</p>
<blockquote>
<p>den teil versteh ich vom sinn her nicht, was soll wo gesichert werden? O.o</p>
</blockquote>
<p>Der Rückgabewert von SelectObject, denn dieser repräsentiert das alte selektierte Objekt. Dann kannst du später dieses Objekt wieder selektieren (blöder Außdruck ich weiß).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/509038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/509038</guid><dc:creator><![CDATA[Rapha]]></dc:creator><pubDate>Mon, 26 Apr 2004 12:16:12 GMT</pubDate></item></channel></rss>