<?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[new und delete in DLLs und Threads]]></title><description><![CDATA[<p>Wenn ich aus einer DLL eine Funktion exportiere, die Speicher mit new allokiert und einen Pointer an dei Anwendung zurückgibt und die den später versucht freizugeben, gibt das einen Fehler. Genasuo wenn ich im Programm Speicher mit new allokiere und den in einer DLL-Funktion mit delete freigeben möchte.<br />
Wiso ist das eigendlich so? Gibt es eine Möglichkeit da drumrum zu kommen?</p>
<p>Und 2. Wenn ich in einem Thread speicher mit new allokiere und einen pointer auf den Speicher zu einem anderen Thread im selben Programm rüberschiebe, kann der zweite Thread dann den Speicher mit delete löschen??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/113953/new-und-delete-in-dlls-und-threads</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 17:44:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/113953.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Jun 2005 17:37:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new und delete in DLLs und Threads on Tue, 28 Jun 2005 17:37:06 GMT]]></title><description><![CDATA[<p>Wenn ich aus einer DLL eine Funktion exportiere, die Speicher mit new allokiert und einen Pointer an dei Anwendung zurückgibt und die den später versucht freizugeben, gibt das einen Fehler. Genasuo wenn ich im Programm Speicher mit new allokiere und den in einer DLL-Funktion mit delete freigeben möchte.<br />
Wiso ist das eigendlich so? Gibt es eine Möglichkeit da drumrum zu kommen?</p>
<p>Und 2. Wenn ich in einem Thread speicher mit new allokiere und einen pointer auf den Speicher zu einem anderen Thread im selben Programm rüberschiebe, kann der zweite Thread dann den Speicher mit delete löschen??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/819230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/819230</guid><dc:creator><![CDATA[mwoidt]]></dc:creator><pubDate>Tue, 28 Jun 2005 17:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete in DLLs und Threads on Tue, 28 Jun 2005 17:46:45 GMT]]></title><description><![CDATA[<p>mwoidt schrieb:</p>
<blockquote>
<p>Wiso ist das eigendlich so?</p>
</blockquote>
<p>exe und dll haben getrennte speicherbereiche</p>
<p>mwoidt schrieb:</p>
<blockquote>
<p>Gibt es eine Möglichkeit da drumrum zu kommen?</p>
</blockquote>
<p>zb: shread memory<br />
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp</a><br />
kommt aber darauf an was du machen willst</p>
<p>zweites habe ich noch nicht probiert. <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/819236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/819236</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Tue, 28 Jun 2005 17:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete in DLLs und Threads on Tue, 28 Jun 2005 18:20:31 GMT]]></title><description><![CDATA[<p>DLL Runtime Library benutzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/819266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/819266</guid><dc:creator><![CDATA[....]]></dc:creator><pubDate>Tue, 28 Jun 2005 18:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete in DLLs und Threads on Tue, 28 Jun 2005 19:04:47 GMT]]></title><description><![CDATA[<p>miller_m schrieb:</p>
<blockquote>
<p>mwoidt schrieb:</p>
<blockquote>
<p>Wiso ist das eigendlich so?</p>
</blockquote>
<p>exe und dll haben getrennte speicherbereiche</p>
<p>mwoidt schrieb:</p>
<blockquote>
<p>Gibt es eine Möglichkeit da drumrum zu kommen?</p>
</blockquote>
<p>zb: shread memory<br />
<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_shared_memory_in_a_dynamic_link_library.asp</a><br />
kommt aber darauf an was du machen willst</p>
<p>zweites habe ich noch nicht probiert. <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>Stimmt nicht ganz. Die dll wird in den addresraum von deinem prozess geladen, d.h. sie greift auch auf den selben speicherbereich zu. shared memory ist also blötsinn.<br />
Das problem das bei mwoidt auftitt ist, das es 2 heap-verwaltungen gibt. Ein heap ist im prinzip ne list mit ner menge speicher-blöcken. Wenn du nun was in der dll allokierst wird der speicherblock in die liste der dll eigetragen. Bei einem delete in der exe knallts jetzt, da es diesen speicherklock in der liste vom exe-heap nicht gibt.<br />
Ein paar ansätze wie man das verhindern kann:<br />
Linke die c-runtime nicht statisch, sondern dynamisch, dann gibts nur eine heap-verwaltung (versuche ich immer zu vermeiden, dann sobald jedem den schalter wieder zurückstellt knallts).<br />
Du machst das delete dort wie do alloziert hast.<br />
Das kannst du z.b. über den Delete/Release-Function machen.<br />
C-Version:</p>
<pre><code class="language-cpp">// DLL
BYTE* AllocData(size_t n) {
  retrun new BYTE[n];
}
void FreeData(BYTE *ptr) {
  delete[] ptr;
}
// exe
void func()
{
  BYTE *data = AllocData(n);
  //...
  FreeData(data);
}
</code></pre>
<p>C++ version</p>
<pre><code class="language-cpp">// DLL
class foo
{
public:
  void Release() {
    delete this;
  }
}

foo* CreateObj() {
  return new foo;
}

// exe
void func()
{
  foo* obj = CreateObj();
  //...
  obj-&gt;Release();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/819295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/819295</guid><dc:creator><![CDATA[CMatt]]></dc:creator><pubDate>Tue, 28 Jun 2005 19:04:47 GMT</pubDate></item></channel></rss>