<?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[Speicherproblem bei Bibliotheken]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Bibliothek geschrieben (unter Windows als DLL, aber das Problem ist bei Shared Libraries unter anderen Systemen vermutlich das gleiche). Diese enthält eine Funktion:</p>
<pre><code>IrgendeineKlasse irgendeine_funktion(){
  return IrgendeineKlasse();
}
</code></pre>
<p>&quot;IrgendeineKlasse&quot; ist eine selbst geschriebene Klasse, die im Konstruktor Speicher allokiert und im Destruktor wieder freigibt. Obiger Code erzeugt also eine neue Instanz dieser Klasse und gibt sie nach außen zurück (also aus der Bibliothek hinaus). Das Problem ist: sobald draußen der Destruktor dieser Klasse versucht den Speicher freizugeben, stürzt das Programm ab. Ich glaube es liegt daran dass der Speicher in einem anderen Prozess angelegt wurde als er freigegeben werden soll.</p>
<p>Umgekehrt geht es allerdings:</p>
<pre><code>void irgendeine_funktion(IrgendeineKlasse a){
}
</code></pre>
<p>Ruft man diese Funktion mit:</p>
<pre><code>irgendeine_funktion(IrgendeineKlasse());
</code></pre>
<p>auf, so muss am Ende der aufgerufenen Funktion das als Parameter übergebene Objekt über den Destruktor zerstört werden. Das funktioniert problemlos.</p>
<p>Wie ist das zu erklären? Werden etwa beim Aufruf einer Bibliotheksfunktion die Parameter bereits im Kontext der Bibliothek erstellt?</p>
<p>Danke im Voraus!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136309/speicherproblem-bei-bibliotheken</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 11:18:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136309.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Feb 2006 07:46:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherproblem bei Bibliotheken on Thu, 09 Feb 2006 07:46:38 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Bibliothek geschrieben (unter Windows als DLL, aber das Problem ist bei Shared Libraries unter anderen Systemen vermutlich das gleiche). Diese enthält eine Funktion:</p>
<pre><code>IrgendeineKlasse irgendeine_funktion(){
  return IrgendeineKlasse();
}
</code></pre>
<p>&quot;IrgendeineKlasse&quot; ist eine selbst geschriebene Klasse, die im Konstruktor Speicher allokiert und im Destruktor wieder freigibt. Obiger Code erzeugt also eine neue Instanz dieser Klasse und gibt sie nach außen zurück (also aus der Bibliothek hinaus). Das Problem ist: sobald draußen der Destruktor dieser Klasse versucht den Speicher freizugeben, stürzt das Programm ab. Ich glaube es liegt daran dass der Speicher in einem anderen Prozess angelegt wurde als er freigegeben werden soll.</p>
<p>Umgekehrt geht es allerdings:</p>
<pre><code>void irgendeine_funktion(IrgendeineKlasse a){
}
</code></pre>
<p>Ruft man diese Funktion mit:</p>
<pre><code>irgendeine_funktion(IrgendeineKlasse());
</code></pre>
<p>auf, so muss am Ende der aufgerufenen Funktion das als Parameter übergebene Objekt über den Destruktor zerstört werden. Das funktioniert problemlos.</p>
<p>Wie ist das zu erklären? Werden etwa beim Aufruf einer Bibliotheksfunktion die Parameter bereits im Kontext der Bibliothek erstellt?</p>
<p>Danke im Voraus!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/989829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/989829</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 07:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem bei Bibliotheken on Thu, 09 Feb 2006 08:04:13 GMT]]></title><description><![CDATA[<p>Hat deine übergebene Klasse auch einen ordentlichen Copy-Ctor und op=, der den verwalteten Speicher tatsächlich kopiert?</p>
<p>(und btw, funktioniert der Code, wenn du die selbe Funktion &quot;intern&quot; aufrufst?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/989842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/989842</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Feb 2006 08:04:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem bei Bibliotheken on Thu, 09 Feb 2006 08:19:54 GMT]]></title><description><![CDATA[<p>Wenn ich die Funktion intern aufrufe geht es.</p>
<p>Copy-Constructor und =-Operator sind vorhangen, werden aber eigentlich gar nicht benötigt.</p>
<p>Wenn man diesen Code ausführt:</p>
<pre><code>MyClass c;
return c;
</code></pre>
<p>, dann wird zuerst eine Instanz erstellt und diese dann für das Zurückgeben mit dem Copy-Constructor kopiert.</p>
<p>Bei</p>
<pre><code>return MyClass();
</code></pre>
<p>(so wie ich es gemacht habe) wird aber direkt das gerade erstellte Objekt zurückgegeben. Beim Aufruf einer Funktion funktioniert es analog.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/989852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/989852</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 08:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem bei Bibliotheken on Thu, 09 Feb 2006 08:23:37 GMT]]></title><description><![CDATA[<p>ChrisR schrieb:</p>
<blockquote>
<p>Ich glaube es liegt daran dass der Speicher in einem anderen Prozess angelegt wurde als er freigegeben werden soll.</p>
</blockquote>
<p>ich schätze mal auf devstudio <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="😉"
    /><br />
in dem fall bei den properties zu der lib _und_ zu dem programm jeweils multithreaded DLL eintragen und rebuild.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/989854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/989854</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Thu, 09 Feb 2006 08:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem bei Bibliotheken on Thu, 09 Feb 2006 14:24:02 GMT]]></title><description><![CDATA[<p>auf gar keinen fall darfst du den rückgabewert von</p>
<pre><code class="language-cpp">IrgendeineKlasse irgendeine_funktion(){
  return IrgendeineKlasse(); 
}
</code></pre>
<p>mit delete wieder freigeben! delete darf nur auf von new gelieferte zeiger angewendet werden. der ausdruck &quot;IrgendeineKlasse()&quot; erzeugt ein <strong>temoräres</strong> objekt, daß, nachdem es von return in das rückgaberegister kopiert worden ist, automatisch wieder zerstört wird.</p>
<p>das selbe gilt auch für</p>
<pre><code class="language-cpp">irgendeine_funktion(IrgendeineKlasse());
</code></pre>
<p>das argument ist ein temoräres objekt, das nach beendigung des funktionsaufrufs automatisch zerstört wird. auch hier darf das argument auf keinen fall in der funktion mit delete freigegeben werden.</p>
<p>wie hast du den compiler überhaupt dazu überredet, delete auf etwas anderes als einen zeiger anzuwenden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> normalerweise sollte da eine fehlermeldung kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990158</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Thu, 09 Feb 2006 14:24:02 GMT</pubDate></item></channel></rss>