<?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ändnisfrage (DC per Referenz übergeben, ReleaseDC) ...]]></title><description><![CDATA[<p>Guten Tach!</p>
<p>Ich habe in meiner Anwendung ein GDI-Leck gefunden, dass ich nicht ganz verstehe.</p>
<p>Ich rufe in WM_MOUSEMOVE eine Funktion DepthOfField() auf, der ich einen Zeiger auf den in WM_MOUSEMOVE erstellten DC (hdc) übergebe. Somit wird per Referenz übergeben, also keine Kopie der Variablen erstellt. Nach meinem Verständnis muss ich ReleaseDC() für diese eine Variable auch nur einmal aufrufen (und zwar in WM_MOUSEMOVE, da sie dort erstellt wurde).</p>
<p>Auf die Sache aufmerksam geworden bin ich durch das erwähnte (und da in WM_MOUSEMOVE sehr heftige) GDI-Leck. Nach viel 'Rumprobieren (nein, nicht das Getränk!) habe ich herausgefunden, dass ich das Leck stopfen kann, indem ich in DepthOfField() ebenfalls ReleaseDC() verwende. Dabei wurde doch lediglich die Adresse von hdc übergeben. Meiner Meinung nach müsste in DepthOfField() gar nicht releast werden, sondern nur in WM_MOUSEMOVE. Sehe ich das falsch?</p>
<p>Also, wo bitteschön ist mein Denkfehler bzw. meine Wissenslücke?</p>
<p>Gruß Matze</p>
<pre><code class="language-cpp">case WM_MOUSEMOVE: {
  UINT mX=LOWORD(lParam);
  UINT mY=HIWORD(lParam);
  //
  HDC hdc=::GetDC(hWnd);  //&lt;= hdc erzeugen
  //POINT pn;
  GetCursorPos(&amp;pnCursor);
  ScreenToClient(hWnd,&amp;pnCursor);
  if(wParam==VK_RBUTTON) {
    HDC hdc=GetDC(hWnd);
    POINT pn;
    pn.x=LOWORD(lParam);
    pn.y=HIWORD(lParam);
    DepthOfField(&amp;hWnd,&amp;hdc,pn);  //&lt;= hdc per Referenz übergeben
  }
  ::ReleaseDC(hWnd,hdc);  //&lt;= hdc freigeben
  return 0;
}

void DepthOfField(HWND *hWnd,HDC *hdc,POINT pnStart) {

  // .
  // .
  // .

  ReleaseDC(*hWnd,*hdc);  //&lt;= auch hier muss hdc freigegeben werden
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/193567/verständnisfrage-dc-per-referenz-übergeben-releasedc</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 13:08:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193567.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Sep 2007 10:09:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 10:09:41 GMT]]></title><description><![CDATA[<p>Guten Tach!</p>
<p>Ich habe in meiner Anwendung ein GDI-Leck gefunden, dass ich nicht ganz verstehe.</p>
<p>Ich rufe in WM_MOUSEMOVE eine Funktion DepthOfField() auf, der ich einen Zeiger auf den in WM_MOUSEMOVE erstellten DC (hdc) übergebe. Somit wird per Referenz übergeben, also keine Kopie der Variablen erstellt. Nach meinem Verständnis muss ich ReleaseDC() für diese eine Variable auch nur einmal aufrufen (und zwar in WM_MOUSEMOVE, da sie dort erstellt wurde).</p>
<p>Auf die Sache aufmerksam geworden bin ich durch das erwähnte (und da in WM_MOUSEMOVE sehr heftige) GDI-Leck. Nach viel 'Rumprobieren (nein, nicht das Getränk!) habe ich herausgefunden, dass ich das Leck stopfen kann, indem ich in DepthOfField() ebenfalls ReleaseDC() verwende. Dabei wurde doch lediglich die Adresse von hdc übergeben. Meiner Meinung nach müsste in DepthOfField() gar nicht releast werden, sondern nur in WM_MOUSEMOVE. Sehe ich das falsch?</p>
<p>Also, wo bitteschön ist mein Denkfehler bzw. meine Wissenslücke?</p>
<p>Gruß Matze</p>
<pre><code class="language-cpp">case WM_MOUSEMOVE: {
  UINT mX=LOWORD(lParam);
  UINT mY=HIWORD(lParam);
  //
  HDC hdc=::GetDC(hWnd);  //&lt;= hdc erzeugen
  //POINT pn;
  GetCursorPos(&amp;pnCursor);
  ScreenToClient(hWnd,&amp;pnCursor);
  if(wParam==VK_RBUTTON) {
    HDC hdc=GetDC(hWnd);
    POINT pn;
    pn.x=LOWORD(lParam);
    pn.y=HIWORD(lParam);
    DepthOfField(&amp;hWnd,&amp;hdc,pn);  //&lt;= hdc per Referenz übergeben
  }
  ::ReleaseDC(hWnd,hdc);  //&lt;= hdc freigeben
  return 0;
}

void DepthOfField(HWND *hWnd,HDC *hdc,POINT pnStart) {

  // .
  // .
  // .

  ReleaseDC(*hWnd,*hdc);  //&lt;= auch hier muss hdc freigegeben werden
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1373731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373731</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 10:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 10:27:46 GMT]]></title><description><![CDATA[<p>Du hast im case-Zweig zwei GetDC()-Aufrufe (der zweite am Anfang des if-Blockes) und mußt natürlich auch für jeden einen korrespondierenden ReleaseDC-Aufruf einbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373741</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 27 Sep 2007 10:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 10:54:18 GMT]]></title><description><![CDATA[<p>HMPFH!</p>
<p>Danke, du hast natürlich Recht. Das war die Sache mit dem Wald und den Bäumen...</p>
<p>Und dass hier kein Compiler-Fehler wegen doppeltem Bezeichner kommt, liegt wahrscheinlich daran, dass der zweite hdc in einem eigenen Block (if) deklariert wird, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373764</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 10:54:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 11:19:47 GMT]]></title><description><![CDATA[<p>Gut erkannt - der if-Block definiert einen eigenen Scope und dort verdeckt das hdc seinen Namensvetter. (aber warum du überhaupt zwei DCs für das Fenster anforderst, ist die andere Frage)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373781</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 11:36:42 GMT]]></title><description><![CDATA[<p>Die Frage ist leicht beantwortet: Die WM_MOUSEMOVE-Behandlung ist wesentlich größer als gepostet, das meiste habe ich der Übersicht halber 'rausgeschmissen (und auch, da es sich um firmeninternen Code handelt). Da muss ich wohl vergessen haben, dass ich mir bereits einen DC hole. Mangels Compiler-Error ist mir das nicht aufgefallen.</p>
<p>Ohne C/C++ schlecht machen zu wollen: In jeder anderen mir vertrauten Sprache wäre das nicht passiert. Daran sieht man auch, dass es in C++ wesentlich mehr Tücken gibt und der Lernprozess deutlich länger (ein Leben lang?) anhält. Mittlerweile geht es ja ganz gut. Wenn ich dran denke, wie aufgeschmissen ich vor 4 Monaten erstmal war, als ich versucht habe, meine ersten C++-Programme zu schreiben...</p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373797</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 11:55:36 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Da muss ich wohl vergessen haben, dass ich mir bereits einen DC hole.<br />
<strong>Mangels Compiler-Error ist mir das nicht aufgefallen</strong>.</p>
</blockquote>
<p>Böse Schlussfolgerung : Ein Kompiler prüft nicht die Programm-Logik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373809</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 12:41:37 GMT]]></title><description><![CDATA[<p>@merker:</p>
<p>Lies doch meine Posts zu Ende. Ich sagte ja, dass dieses Verhalten in den mir bekannten Sprachen (z.B. Clipper, VB) eher unüblich ist. Ein Statement wie</p>
<pre><code class="language-cpp">HDC hdc=::GetDC(hWnd);
HDC hdc=::GetDC(hWnd);
</code></pre>
<p>würde unweigerlich zu einem Compiler-Fehler führen. Dass ich in C++ in einem geschlossenen Block dennoch denselben Bezeichner wiederverwenden kann, ist doch eher eine spezielle Geschichte und mir durch genannte Sprachen nicht bekannt gewesen. Einem Anfänger möge man diese Unwissenheit verzeihen.</p>
<p>Übrigens schreibt man <strong>C</strong>ompiler mit &quot;C&quot;. Wenn du die deutsche Variante benutzen möchtest (was ich nicht verkehrt finde), dann kannst du &quot;Kompilierer&quot; schreiben.</p>
<p>Dies ist sowieso eine Unsitte, die im Internet von vielen gepflegt wird. Genauso schreibt man Ve<strong>k</strong>tor eben mit &quot;k&quot;, und nicht mit &quot;c&quot;, dennoch trifft man sehr häufig auf diese falsche Schreibweise.</p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373855</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 12:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 13:09:13 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Dies ist sowieso eine Unsitte, die im Internet von vielen gepflegt wird. Genauso schreibt man Ve<strong>k</strong>tor eben mit &quot;k&quot;, und nicht mit &quot;c&quot;, dennoch trifft man sehr häufig auf diese falsche Schreibweise.</p>
</blockquote>
<p>Das hängt aber von den Umständen ab - ich schreibe z.B. den mathematischen Vektor mit &quot;k&quot; und den std::vector&lt;&gt; aus der C++ Standardbibliothek mit &quot;c&quot; <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/1373874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373874</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 27 Sep 2007 13:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 13:46:24 GMT]]></title><description><![CDATA[<p>Vielleicht können wir uns ja darauf einigen, dass wir den std::vector (der mit dem mathematischen Vektor ja auch nicht viel zu tun hat) entsprechend der englischen Schreibweise klein und mit &quot;c&quot; schreiben und den mathematischen Vektor dann eben groß und mit &quot;k&quot;.</p>
<p>Allerdings ist diese Regel vielleicht doch nicht ausreichend. Wenn nun jemand darauf besteht, für den mathematischen Vektor die englische Schreibweise zu nutzen (in der Hoch-Zeit des Denglisch durchaus denkbar), dann müsste er wiederum &quot;vector&quot; schreiben...</p>
<p>Nun ja, vielleicht verzichte ich in Zukunft einfach auf Wörter, die ein &quot;c&quot; oder &quot;k&quot; enthalten. Der Verwirrungsfa<strong>c</strong>tor ist einfach zu hoch... Am Ende lande ich noch mit Hirn<strong>c</strong>rämpfen im <strong>C</strong>rankenhaus... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373901</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 13:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 13:48:11 GMT]]></title><description><![CDATA[<p>Und jetzt sollten wir diese (unterhaltsame) Diskussion abbrechen. Schließlich geht es hier im Forum um K/K++ (der musste sein)...</p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373903</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 27 Sep 2007 13:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage (DC per Referenz übergeben, ReleaseDC) ... on Thu, 27 Sep 2007 13:50:07 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>Vielleicht können wir uns ja darauf einigen, dass wir den std::vector (der mit dem mathematischen Vektor ja auch nicht viel zu tun hat) entsprechend der englischen Schreibweise klein und mit &quot;c&quot; schreiben und den mathematischen Vektor dann eben groß und mit &quot;k&quot;.</p>
</blockquote>
<p>Gegenvorschlag: Jeder schreibt so, daß der Gegenüber ihn versteht - wer dagegen verstößt, wird drauf hingewiesen und stellt die Missverständnisse klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<blockquote>
<p>Nun ja, vielleicht verzichte ich in Zukunft einfach auf Wörter, die ein &quot;c&quot; oder &quot;k&quot; enthalten. Der Verwirrungsfa<strong>c</strong>tor ist einfach zu hoch... Am Ende lande ich noch mit Hirn<strong>c</strong>rämpfen im <strong>C</strong>rankenhaus... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nihts für mih - da önnte ih noh niht mal meinen Namen ausshreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373906</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 27 Sep 2007 13:50:07 GMT</pubDate></item></channel></rss>