<?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[Problem mit Zeigern, die mit new erstellt worden sind]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Verständnisproblem mit dem Anlegen von Zeigern auf dem Heap. Kurz zur Aufgabenstellung: ich arbeite bei der Darstellung meiner Animation in der Offscreentechnik. Auf dem Bildschirm sollen Messwerte grafisch dargestellt werden. Ein Thread bedient die Messkarte und schreibt Messwerte in Variablen der Doc-Klasse. Dort werden auch die darzustellenden Bildpunkte errechnet. Somit ist die Kapselung dieses Threads gewährleistet. Ich habe dazu in meiner Doc-Klasse zwei Membervariablen definiert:</p>
<pre><code class="language-cpp">CBitmap*  m_pBitmap
CBitmap*  m_pBitmapCopy
</code></pre>
<p>Es werden immer zwei benötigt, da die Copy einzig und allein dazu da ist, von der View-Klasse die Darstellung und somit den Zugriff zu realisieren, während der Workerthread bereits wieder Bildpunkte berechnet und in die andere Bitmap reinschreibt.</p>
<p>Im Konstruktor meiner Doc-Klasse wird folgender Code aufgerufen:</p>
<pre><code class="language-cpp">void CMyAppDoc::Erstelle_Bitmap(void)
{
	 CDC memDC;
	 memDC.CreateCompatibleDC (NULL);
	 CBitmap *pOldBitmap;

	 COLORREF rgbColor;

	 m_pBitmap = new CBitmap ();
     m_pBitmap-&gt;CreateBitmap (kViewSize_x, kViewSize_y, 1, memDC.GetDeviceCaps (BITSPIXEL), NULL);
     m_pBitmapCopy = new CBitmap ();
     m_pBitmapCopy-&gt;CreateBitmap (kViewSize_x, kViewSize_y, 1, memDC.GetDeviceCaps (BITSPIXEL), NULL);

     // Initialisieren der Bitmap zur Berechnung 
     pOldBitmap = memDC.SelectObject (m_pBitmap);
     // Schwarz
     memDC.PatBlt (0,0,kViewSize_x,kViewSize_y,BLACKNESS);

	 {
		 int Hintergrundmodus=GetBkMode(memDC);
		 SetBkMode(memDC,TRANSPARENT);
		 rgbColor = RGB(255,255,255);
		 CPen	Pen_solid(PS_SOLID, 0, rgbColor);
		 CPen	Pen_dash(PS_DOT, 0, rgbColor);
		 CPen*	oldPen;
		 oldPen = memDC.SelectObject(&amp;Pen_solid);
		 memDC.MoveTo((kViewSize_x/2),0);
		 memDC.LineTo((kViewSize_x/2),(kViewSize_y));
		 memDC.SelectObject(&amp;Pen_dash);
		 int Breite_Fadenkreuz=40;
		 memDC.MoveTo(Mittelpunkt_links.x,(Mittelpunkt_links.y-Breite_Fadenkreuz/2));
		 memDC.LineTo(Mittelpunkt_links.x,(Mittelpunkt_links.y+Breite_Fadenkreuz/2));
		 memDC.MoveTo(Mittelpunkt_rechts.x,(Mittelpunkt_rechts.y-Breite_Fadenkreuz/2));
		 memDC.LineTo(Mittelpunkt_rechts.x,(Mittelpunkt_rechts.y+Breite_Fadenkreuz/2));
		 memDC.MoveTo((Mittelpunkt_links.x-Breite_Fadenkreuz/2),Mittelpunkt_links.y);
		 memDC.LineTo((Mittelpunkt_links.x+Breite_Fadenkreuz/2),Mittelpunkt_links.y);
		 memDC.MoveTo((Mittelpunkt_rechts.x-Breite_Fadenkreuz/2),Mittelpunkt_rechts.y);
		 memDC.LineTo((Mittelpunkt_rechts.x+Breite_Fadenkreuz/2),Mittelpunkt_rechts.y);
		 memDC.SelectObject(oldPen);
		 SetBkMode(memDC,Hintergrundmodus);
	 }
	 // Aufräumen
     memDC.SelectObject (pOldBitmap);
}
</code></pre>
<p>Zum Darstellen des Ganzen wird dann einfach in der OnDraw-Methode die Bitmap aus dem Speichergerätekontext auf den Bildschirm geblittet.</p>
<p>Das funktioniert auch soweit ganz gut. Problematisch wird das ganze, wenn ich einen neuen Messzyklus aufrufen möchte. Dazu lösche ich die beiden Bitmaps wie folgt:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap(void)
{
	if (m_pBitmap)
		delete m_pBitmap;
	if (m_pBitmapCopy)
		delete m_pBitmapCopy;
}
</code></pre>
<p>Der gleiche Code wird auch vom Destruktor der Doc-Klasse aufgerufen.</p>
<p>Jetzt das Problem: führe ich nur einen Messdurchgang aus funktioniert das Ganze wunderbar. Will der Nutzer einen neuen Messdurchgang durchführen (Klick auf einen Button) und überlegt es sich dann aber doch anders und beendet das Programm bekomme ich eine unbehandelte Ausnahme an der Stelle delete m_pBitmap. In diesem Falle wird diese Löschfunktion zweimal hintereinander aufgerufen. Die Prüfung, ob die Membervariable einen gültigen Zeiger auf ein CBitmap-Object hat, scheint hier positiv zu sein obwohl ich doch beim vorherigen Durchlauf den Zeiger mit delete freigegeben habe. Wo liegt hier der Fehler? Dieses Problem taucht nicht auf wenn ich lösche und mit new eine neue Bitmap anlege...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/158760/problem-mit-zeigern-die-mit-new-erstellt-worden-sind</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 22:32:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158760.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 Sep 2006 10:15:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 10:15:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Verständnisproblem mit dem Anlegen von Zeigern auf dem Heap. Kurz zur Aufgabenstellung: ich arbeite bei der Darstellung meiner Animation in der Offscreentechnik. Auf dem Bildschirm sollen Messwerte grafisch dargestellt werden. Ein Thread bedient die Messkarte und schreibt Messwerte in Variablen der Doc-Klasse. Dort werden auch die darzustellenden Bildpunkte errechnet. Somit ist die Kapselung dieses Threads gewährleistet. Ich habe dazu in meiner Doc-Klasse zwei Membervariablen definiert:</p>
<pre><code class="language-cpp">CBitmap*  m_pBitmap
CBitmap*  m_pBitmapCopy
</code></pre>
<p>Es werden immer zwei benötigt, da die Copy einzig und allein dazu da ist, von der View-Klasse die Darstellung und somit den Zugriff zu realisieren, während der Workerthread bereits wieder Bildpunkte berechnet und in die andere Bitmap reinschreibt.</p>
<p>Im Konstruktor meiner Doc-Klasse wird folgender Code aufgerufen:</p>
<pre><code class="language-cpp">void CMyAppDoc::Erstelle_Bitmap(void)
{
	 CDC memDC;
	 memDC.CreateCompatibleDC (NULL);
	 CBitmap *pOldBitmap;

	 COLORREF rgbColor;

	 m_pBitmap = new CBitmap ();
     m_pBitmap-&gt;CreateBitmap (kViewSize_x, kViewSize_y, 1, memDC.GetDeviceCaps (BITSPIXEL), NULL);
     m_pBitmapCopy = new CBitmap ();
     m_pBitmapCopy-&gt;CreateBitmap (kViewSize_x, kViewSize_y, 1, memDC.GetDeviceCaps (BITSPIXEL), NULL);

     // Initialisieren der Bitmap zur Berechnung 
     pOldBitmap = memDC.SelectObject (m_pBitmap);
     // Schwarz
     memDC.PatBlt (0,0,kViewSize_x,kViewSize_y,BLACKNESS);

	 {
		 int Hintergrundmodus=GetBkMode(memDC);
		 SetBkMode(memDC,TRANSPARENT);
		 rgbColor = RGB(255,255,255);
		 CPen	Pen_solid(PS_SOLID, 0, rgbColor);
		 CPen	Pen_dash(PS_DOT, 0, rgbColor);
		 CPen*	oldPen;
		 oldPen = memDC.SelectObject(&amp;Pen_solid);
		 memDC.MoveTo((kViewSize_x/2),0);
		 memDC.LineTo((kViewSize_x/2),(kViewSize_y));
		 memDC.SelectObject(&amp;Pen_dash);
		 int Breite_Fadenkreuz=40;
		 memDC.MoveTo(Mittelpunkt_links.x,(Mittelpunkt_links.y-Breite_Fadenkreuz/2));
		 memDC.LineTo(Mittelpunkt_links.x,(Mittelpunkt_links.y+Breite_Fadenkreuz/2));
		 memDC.MoveTo(Mittelpunkt_rechts.x,(Mittelpunkt_rechts.y-Breite_Fadenkreuz/2));
		 memDC.LineTo(Mittelpunkt_rechts.x,(Mittelpunkt_rechts.y+Breite_Fadenkreuz/2));
		 memDC.MoveTo((Mittelpunkt_links.x-Breite_Fadenkreuz/2),Mittelpunkt_links.y);
		 memDC.LineTo((Mittelpunkt_links.x+Breite_Fadenkreuz/2),Mittelpunkt_links.y);
		 memDC.MoveTo((Mittelpunkt_rechts.x-Breite_Fadenkreuz/2),Mittelpunkt_rechts.y);
		 memDC.LineTo((Mittelpunkt_rechts.x+Breite_Fadenkreuz/2),Mittelpunkt_rechts.y);
		 memDC.SelectObject(oldPen);
		 SetBkMode(memDC,Hintergrundmodus);
	 }
	 // Aufräumen
     memDC.SelectObject (pOldBitmap);
}
</code></pre>
<p>Zum Darstellen des Ganzen wird dann einfach in der OnDraw-Methode die Bitmap aus dem Speichergerätekontext auf den Bildschirm geblittet.</p>
<p>Das funktioniert auch soweit ganz gut. Problematisch wird das ganze, wenn ich einen neuen Messzyklus aufrufen möchte. Dazu lösche ich die beiden Bitmaps wie folgt:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap(void)
{
	if (m_pBitmap)
		delete m_pBitmap;
	if (m_pBitmapCopy)
		delete m_pBitmapCopy;
}
</code></pre>
<p>Der gleiche Code wird auch vom Destruktor der Doc-Klasse aufgerufen.</p>
<p>Jetzt das Problem: führe ich nur einen Messdurchgang aus funktioniert das Ganze wunderbar. Will der Nutzer einen neuen Messdurchgang durchführen (Klick auf einen Button) und überlegt es sich dann aber doch anders und beendet das Programm bekomme ich eine unbehandelte Ausnahme an der Stelle delete m_pBitmap. In diesem Falle wird diese Löschfunktion zweimal hintereinander aufgerufen. Die Prüfung, ob die Membervariable einen gültigen Zeiger auf ein CBitmap-Object hat, scheint hier positiv zu sein obwohl ich doch beim vorherigen Durchlauf den Zeiger mit delete freigegeben habe. Wo liegt hier der Fehler? Dieses Problem taucht nicht auf wenn ich lösche und mit new eine neue Bitmap anlege...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133540</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Fri, 08 Sep 2006 10:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 10:29:28 GMT]]></title><description><![CDATA[<p>AndyDD schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap(void)
{
	if (m_pBitmap)
		delete m_pBitmap;
	if (m_pBitmapCopy)
		delete m_pBitmapCopy;
}
</code></pre>
</blockquote>
<p>Wie wär es denn mit:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap()
{
	if (m_pBitmap)
    {
		delete m_pBitmap;
		m_pBitmap = 0;
    }
	if (m_pBitmapCopy)
    {
		delete m_pBitmapCopy;
		m_pBitmapCopy = 0;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1133550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133550</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Fri, 08 Sep 2006 10:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 10:33:23 GMT]]></title><description><![CDATA[<p>jencas schrieb:</p>
<blockquote>
<p>AndyDD schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap(void)
{
	if (m_pBitmap)
		delete m_pBitmap;
	if (m_pBitmapCopy)
		delete m_pBitmapCopy;
}
</code></pre>
</blockquote>
<p>Wie wär es denn mit:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap()
{
	if (m_pBitmap)
    {
		delete m_pBitmap;
		m_pBitmap = 0;
    }
	if (m_pBitmapCopy)
    {
		delete m_pBitmapCopy;
		m_pBitmapCopy = 0;
    }
}
</code></pre>
</blockquote>
<p>Die if's kannst dir sparen, das testet delete selber</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap()
{
	delete m_pBitmap;
	m_pBitmap = 0;
    delete m_pBitmapCopy;
	m_pBitmapCopy = 0;    
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1133557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133557</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 08 Sep 2006 10:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 11:21:40 GMT]]></title><description><![CDATA[<p>Vielen Dank erst mal. Laut Debugger steht in der Tat in der Variablen der Wert 0x00000000, nach dem delete allerdings steht da immer 0xfeeefeee. Ist ja ein typischer Anfängerfehler, peinlich peinlich.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Aber korrekterweise schreibt man folgendes:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap()
{
	delete m_pBitmap;
	m_pBitmap = NULL;
    delete m_pBitmapCopy;
	m_pBitmapCopy = NULL;    
}
</code></pre>
<p>Warum wird aber der Wert der Membervariablen gerade auf diesen Wert gestetzt? Ich würde ja verstehen wenn die alte Zeigeradresse drin bleiben würde und man nur den Zeiger selbst löscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133584</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Fri, 08 Sep 2006 11:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 11:25:48 GMT]]></title><description><![CDATA[<p>Ich weiss es nicht genau, aber ich glaube, dass hat damit zu tun, dass die Speicherverwaltung im Debug-Modus ein wenig anders funktioniert als in der Release Version. Und im Debug-Modus wird meines wissens halt der Zeiger auf 0xfeeefeee gesetzt, wenn man delete nutzt.<br />
Kann mich da aber auch irren <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/1133594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133594</guid><dc:creator><![CDATA[Mr.Yellow]]></dc:creator><pubDate>Fri, 08 Sep 2006 11:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Fri, 08 Sep 2006 13:52:25 GMT]]></title><description><![CDATA[<p>Das kann schon sein. Aber ich würde den dann standardmäßig auf NULL setzen, dann würde dieses Problem nicht auftreten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133740</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Fri, 08 Sep 2006 13:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Sun, 10 Sep 2006 07:01:42 GMT]]></title><description><![CDATA[<p>beim Aufräumen in der Funktion die Dein Bitmap erstellt, muss folgendes eingefügt werden...</p>
<p>bitmap.DeleteObject();</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1134490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1134490</guid><dc:creator><![CDATA[irgendwer]]></dc:creator><pubDate>Sun, 10 Sep 2006 07:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Sun, 10 Sep 2006 15:54:58 GMT]]></title><description><![CDATA[<p>[quote=&quot;AndyDD&quot;]Vielen Dank erst mal. Laut Debugger steht in der Tat in der Variablen der Wert 0x00000000, nach dem delete allerdings steht da immer 0xfeeefeee. Ist ja ein typischer Anfängerfehler, peinlich peinlich.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Aber korrekterweise schreibt man folgendes:</p>
<pre><code class="language-cpp">void CMyAppDoc::Loesche_Bitmap()
{
	delete m_pBitmap;
	m_pBitmap = NULL;
    delete m_pBitmapCopy;
	m_pBitmapCopy = NULL;    
}
</code></pre>
<p>Nö nix korrekter Weise!<br />
NULL gehört nicht zum C++ Standard und is nen define aus C. Daher wäre die 0 korrekt. da NULL aber meist immer da ist, machts dann doch keinen Unterschied^^<br />
Außer das defines nicht soo schön sind</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1134693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1134693</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Sun, 10 Sep 2006 15:54:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern, die mit new erstellt worden sind on Mon, 11 Sep 2006 05:35:33 GMT]]></title><description><![CDATA[<p>Ja ok, NULL ist ein define, ob das zum Standard gehört kann ich nicht sagen, also vielen Dank für die Info.</p>
<p>irgendwer schrieb:</p>
<blockquote>
<p>beim Aufräumen in der Funktion die Dein Bitmap erstellt, muss folgendes eingefügt werden...</p>
<p>bitmap.DeleteObject();</p>
</blockquote>
<p>Wo soll das eingefügt werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1134875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1134875</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Mon, 11 Sep 2006 05:35:33 GMT</pubDate></item></channel></rss>