<?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[Heap Probleme nach FreeLibrary]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin etwas verzweifelt, vielleicht kann mir hier ja ein Guru bei meinem Problem helfen.</p>
<p>Ich habe eine DLL und ein EXE. Die DLL legt am Heap Speicher an (mit new) den ich dann in der EXE wieder freigegeben will.</p>
<p>Das sollte theoretisch ja gehen wenn beide gegen die selbe CRT DLL linken (und das tun sie auch - in meinem Fall ist es msvcp80.dll). Das haut auch soweit alles hin (d.h. ich lege den Speicher in der DLL an und mache ein delete in der EXE).</p>
<p>ALLERDINGS ... wenn ich vor dem Freigeben ein FreeLibrary mache um die DLL zu entladen, dann funktioniert es nicht mehr und ich bekomme eine Exception bei dem delete.</p>
<p>Die Frage ist jetzt: warum? So wie ich das verstehe sollte das &quot;unloaden&quot; der DLL ja nichts am CRT Heap verändern, den sich DLL und EXE teilen. Auch in der Doku steht über derartige Effekte nichts ...</p>
<p>Im Web habe ich zu dem Problem nur gefunden, dass man wenn man den Heap zwischen DLL und EXE &quot;sharen&quot; will gegen die DLL-Version der CRT linken muss (was ich ja mache).</p>
<p>Also, vielleicht kann mir hier jemand helfen.</p>
<p>--<br />
Vielen Dank,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/147317/heap-probleme-nach-freelibrary</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 16:17:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147317.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 May 2006 19:35:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Mon, 15 May 2006 19:35:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin etwas verzweifelt, vielleicht kann mir hier ja ein Guru bei meinem Problem helfen.</p>
<p>Ich habe eine DLL und ein EXE. Die DLL legt am Heap Speicher an (mit new) den ich dann in der EXE wieder freigegeben will.</p>
<p>Das sollte theoretisch ja gehen wenn beide gegen die selbe CRT DLL linken (und das tun sie auch - in meinem Fall ist es msvcp80.dll). Das haut auch soweit alles hin (d.h. ich lege den Speicher in der DLL an und mache ein delete in der EXE).</p>
<p>ALLERDINGS ... wenn ich vor dem Freigeben ein FreeLibrary mache um die DLL zu entladen, dann funktioniert es nicht mehr und ich bekomme eine Exception bei dem delete.</p>
<p>Die Frage ist jetzt: warum? So wie ich das verstehe sollte das &quot;unloaden&quot; der DLL ja nichts am CRT Heap verändern, den sich DLL und EXE teilen. Auch in der Doku steht über derartige Effekte nichts ...</p>
<p>Im Web habe ich zu dem Problem nur gefunden, dass man wenn man den Heap zwischen DLL und EXE &quot;sharen&quot; will gegen die DLL-Version der CRT linken muss (was ich ja mache).</p>
<p>Also, vielleicht kann mir hier jemand helfen.</p>
<p>--<br />
Vielen Dank,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058446</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Mon, 15 May 2006 19:35:42 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Mon, 15 May 2006 19:39:18 GMT]]></title><description><![CDATA[<p>Hab keine Erklärung. Vermutlich gibt doch jemand in Deiner DLL den Speicher frei.<br />
PS: Was geht denn genau nicht? Wie heisst die Fehlermeldung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058450</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Mon, 15 May 2006 19:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Mon, 15 May 2006 19:55:52 GMT]]></title><description><![CDATA[<p>Jochen Kalmbach schrieb:</p>
<blockquote>
<p>Hab keine Erklärung. Vermutlich gibt doch jemand in Deiner DLL den Speicher frei.<br />
PS: Was geht denn genau nicht? Wie heisst die Fehlermeldung?</p>
</blockquote>
<p>Sieht nicht so aus auls würde der Speicher freigegeben: Ich hab' das ganze durchdebugged und der Destructor des angelegten Objekts wird nur ein einziges mal aufgerufen.</p>
<p>Ausserdem sollte es ja dann auch Probleme geben will ich die DLL nicht entlade. Das Ding hat keine spezielle DllMain, verwendet also nur die Standard _DllMainCRTStartup.</p>
<p>Der Fehler ist eine normale &quot;du machst was mit einem ungültigen Pointer&quot; Exception: &quot;Access violation reading location 0x03da27ac.&quot;</p>
<p>--<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058462</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Mon, 15 May 2006 19:55:52 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Mon, 15 May 2006 20:02:10 GMT]]></title><description><![CDATA[<p>Stefan80 schrieb:</p>
<blockquote>
<p>Ich habe eine DLL und ein EXE. Die DLL legt am Heap Speicher an (mit new) den ich dann in der EXE wieder freigegeben will.</p>
</blockquote>
<p>auch wenn du's jetzt hinbekommen solltest, sowas kann später wieder zu problemen führen. mach's doch z.b. so<br />
exe legt speicher an und gibt einen pointer an die dll<br />
- oder -<br />
dll holt sich speicher mit 'VirtualAlloc' welchen die exe mit 'VirtualFree' wieder freigeben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058468</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Mon, 15 May 2006 20:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Mon, 15 May 2006 20:07:40 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>auch wenn du's jetzt hinbekommen solltest, sowas kann später wieder zu problemen führen. mach's doch z.b. so<br />
exe legt speicher an und gibt einen pointer an die dll<br />
- oder -<br />
dll holt sich speicher mit 'VirtualAlloc' welchen die exe mit 'VirtualFree' wieder freigeben kann.</p>
</blockquote>
<p>Ist schon richtig was du sagst, aber wenn man eben mit einer ziemlich grossen Codebasis arbeiten muss ist es nicht so leicht das ganze Speichermanagement umzubauen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058475</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Mon, 15 May 2006 20:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 06:10:22 GMT]]></title><description><![CDATA[<p>Stefan80 schrieb:</p>
<blockquote>
<p>Ich habe eine DLL und ein EXE. Die DLL legt am Heap Speicher an (mit new) den ich dann in der EXE wieder freigegeben will.</p>
</blockquote>
<p>Also dieses Design gehört verboten. Speicher in einer DLL zu allokieren und in einer EXE freizugeben geht nur wenn EXE und DLL die selbe als DLL gebundene CRT verwenden!<br />
Ansonsten knallt es an allen Ecken, weil nicht der selbe Heap für die Allokationen verwendet wird.</p>
<p>Verwenden EXE und CRT die selbe CRT als DLL? Oder hast Du die CRT etwa statisch gebunden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058571</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 16 May 2006 06:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 09:46:11 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Also dieses Design gehört verboten. Speicher in einer DLL zu allokieren und in einer EXE freizugeben geht nur wenn EXE und DLL die selbe als DLL gebundene CRT verwenden!<br />
Ansonsten knallt es an allen Ecken, weil nicht der selbe Heap für die Allokationen verwendet wird.</p>
<p>Verwenden EXE und CRT die selbe CRT als DLL? Oder hast Du die CRT etwa statisch gebunden?</p>
</blockquote>
<p>Also wenn du mein ursprüngliches Posting gelesen hast, dann erkennst du, dass EXE und DLL dynamisch gegen die DLL-Version der CRT gelinkt werden, also beide eben schon den selben Heap (das hab ich auch überprüft) verwenden.</p>
<p>Im Übrigen habe ich jetzt eine Theorie was passieren könnte. Vielleicht hat hier jemand Erfahrungen damit:</p>
<p>Bei dem Speicher der DLL angelegt und in der EXE freigegeben werden soll handelt es sich um die Instanz eine Klasse. Der Code dieser Klasse liegt in einer Library gegen die sowohl EXE als auch DLL statisch linken. Könnte es sein, dass durch das Entladen der DLL mit FreeLibrary auch der Code der Klasse entladen wird obwohl die LIB auch gegen die EXE gelinkt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058695</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Tue, 16 May 2006 09:46:11 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 09:53:14 GMT]]></title><description><![CDATA[<p>Stefan80 schrieb:</p>
<blockquote>
<p>Bei dem Speicher der DLL angelegt und in der EXE freigegeben werden soll handelt es sich um die Instanz eine Klasse. Der Code dieser Klasse liegt in einer Library gegen die sowohl EXE als auch DLL statisch linken. Könnte es sein, dass durch das Entladen der DLL mit FreeLibrary auch der Code der Klasse entladen wird obwohl die LIB auch gegen die EXE gelinkt wird?</p>
</blockquote>
<p>Ja, das ist sogar sehr wahrscheinlich - FreeLibrary() räumt alles auf, was zur Lib gehört, also auch den Code der darin enthaltenen Funktionen (inklusive deinem Dtor).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058701</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 16 May 2006 09:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 09:58:14 GMT]]></title><description><![CDATA[<p>Stefan80 schrieb:</p>
<blockquote>
<p>Bei dem Speicher der DLL angelegt und in der EXE freigegeben werden soll handelt es sich um die Instanz eine Klasse. Der Code dieser Klasse liegt in einer Library gegen die sowohl EXE als auch DLL statisch linken. Könnte es sein, dass durch das Entladen der DLL mit FreeLibrary auch der Code der Klasse entladen wird obwohl die LIB auch gegen die EXE gelinkt wird?</p>
</blockquote>
<p>das stimmt schon. wenn beide, also die dll und die exe, eine lib statisch linken dann hat jeder seine eigene kopie der lib. der code ist also doppelt vorhanden und wenn du die dll entdlädst ist deren code nicht mehr da....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058707</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Tue, 16 May 2006 09:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 10:15:28 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>das stimmt schon. wenn beide, also die dll und die exe, eine lib statisch linken dann hat jeder seine eigene kopie der lib. der code ist also doppelt vorhanden und wenn du die dll entdlädst ist deren code nicht mehr da....</p>
</blockquote>
<p>Hmmmm, ja ... das macht schon Sinn. Die Frage ist nur wie ich das lösen könnte.</p>
<p>Kurze Erklärung: Wir haben eine recht grosse Library die immer statisch gegen die EXE gelinkt wird. Die DLL von der ich spreche ist Teil eines Plugin-Mechanismus in der Library, d.h. die Lib lädt eine DLL, die DLL legt ein paar Objekte an und wird dann wieder entladen (wie gesagt handelt es sich dabei immer um &quot;bekannte&quot; Objekte aus die Library).</p>
<p>Irgendwelche Ideen wie ich das hinkriegen könnte ohne substantielle Änderungen an unserer Library vorzunehmen ... ?</p>
<p>Danke für eure Hilfe!</p>
<p>--<br />
Schöne Grüsse,<br />
Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058720</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Tue, 16 May 2006 10:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 10:54:12 GMT]]></title><description><![CDATA[<p>Stefan80 schrieb:</p>
<blockquote>
<p>Irgendwelche Ideen wie ich das hinkriegen könnte ohne substantielle Änderungen an unserer Library vorzunehmen ... ?</p>
</blockquote>
<p>warum musst du die dll entladen? lass die doch einfach da</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058765</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Tue, 16 May 2006 10:54:12 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Probleme nach FreeLibrary on Tue, 16 May 2006 11:38:47 GMT]]></title><description><![CDATA[<p>net schrieb:</p>
<blockquote>
<p>Irgendwelche Ideen wie ich das hinkriegen könnte ohne substantielle Änderungen an unserer Library vorzunehmen ... ?</p>
</blockquote>
<p>warum musst du die dll entladen? lass die doch einfach da[/quote]</p>
<p>Naja, es wird dann relativ viele solcher Plugin-DLLs geben (&gt; 50), die jeweils nur für eine kurze Zeit benötigt werden. Ich weiss nicht ob es optimal ist sie einfach nicht zu entladen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058803</guid><dc:creator><![CDATA[Stefan80]]></dc:creator><pubDate>Tue, 16 May 2006 11:38:47 GMT</pubDate></item></channel></rss>