<?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[Test, ob Objekt im Heap oder Stack ist]]></title><description><![CDATA[<p>Hallo,</p>
<p>kann man in C++ auf irgendeine Weise feststellen, ob ein Objekt, von dem man nur einen Zeiger besitzt, sich im Heap oder im Stack befindet?<br />
Das sollte dann etwa eine Funktion wie die folgende sein:</p>
<pre><code>bool ObjectInHeap (void *obj)
{
   falls obj im Heap
      return true;
   falls obj in Stack
      return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/243154/test-ob-objekt-im-heap-oder-stack-ist</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:48:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243154.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 13 Jun 2009 10:34:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 10:34:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>kann man in C++ auf irgendeine Weise feststellen, ob ein Objekt, von dem man nur einen Zeiger besitzt, sich im Heap oder im Stack befindet?<br />
Das sollte dann etwa eine Funktion wie die folgende sein:</p>
<pre><code>bool ObjectInHeap (void *obj)
{
   falls obj im Heap
      return true;
   falls obj in Stack
      return false;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1725918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725918</guid><dc:creator><![CDATA[fqt4]]></dc:creator><pubDate>Sat, 13 Jun 2009 10:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 10:40:38 GMT]]></title><description><![CDATA[<p>Ne (der C++-Standard kennt afaik &quot;Heap&quot; und &quot;Stack&quot; nicht), und wofür brauchst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725920</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 13 Jun 2009 10:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 11:32:09 GMT]]></title><description><![CDATA[<blockquote>
<p>kann man in C++ auf irgendeine Weise feststellen, ob ein Objekt, von dem man nur einen Zeiger besitzt, sich im Heap oder im Stack befindet?</p>
</blockquote>
<p>Nein, das geht nicht (kurze Antwort).<br />
Die lange Antwort findest Du in einem der Effective C++ Bücher von Scott Meyers.</p>
<p>Ein Workaround:<br />
Ein Ansatz ist es eine Factory Methode anzubieten, die das Objekt auf dem Heap erzeugt. Dabei ist der Konstruktor privat. Dann ist garantiert, dass das Objekt eben auf dem Heap liegt.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725932</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 13 Jun 2009 11:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 11:55:28 GMT]]></title><description><![CDATA[<p>Das funktioniert nicht. Meistens deuten auch Versuche, das herauszufinden, auf fragwürdiges Design hin (z.B. falls ein Objekt im Heap ist, soll es automatisch freigegeben werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725938</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 13 Jun 2009 11:55:28 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 11:57:10 GMT]]></title><description><![CDATA[<p>Wäre es denn sicher, den new-Operator in der Klasse zu überladen, von der ich wissen will, ob sie auf dem Heap liegt. zu überladen und die Addresse abzuspeichern. Nun hat man eine Liste aller auf dem Heap liegenden Objekte; die anderen sind dann auf dem Stack.(?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725939</guid><dc:creator><![CDATA[fqt4]]></dc:creator><pubDate>Sat, 13 Jun 2009 11:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 11:58:59 GMT]]></title><description><![CDATA[<p>Wozu brauchst du das überhaupt? Gut möglich, dass es bessere Ansätze gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725941</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 13 Jun 2009 11:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 12:05:30 GMT]]></title><description><![CDATA[<p>für die Implementierung einer sicheren Zeigerklasse ähnlich wie boost::shared_ptr-Klasse. Falls ein Objekt auf dem Stack abgelegt wird, soll der Mechanismus der automatischen Destruktion automatisch ausgeschaltet werden; zusätzlich soll - zumindest in der Debug Version - bei der automatischen Destruktion geprüft werden, ob noch weitere Zeiger auf das Objekt existieren.<br />
Ein Workaround wäre ja, dies im Konstruktor als Parameter mitanzugeben; es scheint mir allerdings ein wenig umständlich. Außerdem funktionieren Standardkopierkonstruktoren dann nicht mehr so gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725942</guid><dc:creator><![CDATA[fqt4]]></dc:creator><pubDate>Sat, 13 Jun 2009 12:05:30 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 12:24:35 GMT]]></title><description><![CDATA[<p>Genau das dachte ich mir. <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>
<p>Smart-Pointer brauchen aber keinen solchen Mechanismus, da sie ihr Objekt grundsätzlich <strong>immer</strong> auf dem Heap anlegen. Was bei <code>shared_ptr</code> noch dazukommt, ist die Referenzzählung. Es wird geschaut, wieviele andere Smart-Pointers auf ein Objekt zeigen. Der letzte gibt dann frei. Falls du was eigenes implementieren willst (wohl eher zu Übungs- und Testzwecken, Boost schlägst du nicht so schnell), würde ich dir raten, ebenfalls ausschliesslich auf dem Heap zu arbeiten. Zeiger auf Objekte auf dem Stack brauchen ja nicht &quot;smart&quot; zu sein.</p>
<p>Auch <code>shared_ptr</code> wird den Speicher zerschreiben, wenn du ihm ein Objekt übergibst, das auf dem Stack erstellt wurde (vom modifizierbaren Deleter mal abgesehen).</p>
<p><em>P.S. &quot;Stack&quot; und &quot;Heap&quot; sind zwar geläufige Begriffe, aber nicht ganz korrekt. Ich würde eher &quot;automatischer&quot; und &quot;dynamischer Speicherbereich&quot; verwenden.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725952</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 13 Jun 2009 12:24:35 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sat, 13 Jun 2009 12:56:41 GMT]]></title><description><![CDATA[<p>Noch eine Anmerkung:<br />
Es gibt nicht nur &quot;Stack-&quot; und &quot;Heapspeicher&quot;. Es gibt auch noch die Möglichkeit, dass man rohen Speicher selber verwaltet über <em>placement new</em>. Daher ist die optionale Übergade eines Destruktors an den Konstruktor des <code>shared_ptr</code> eine sehr feine Sache, da man das Verhalten dann selber steuern kann, wie man es gerade benötigt. Man hat also viel mehr Möglichkeiten, als wenn du es automatisieren willst.</p>
<p>Mach es lieber so, dass der <em>smart pointer</em> per Standard ein Destruktorobjekt erstellt, welches &quot;Heapspeicher&quot; freigibt, also per delete, und dann noch eine Möglichkeit, dass der Benutzer der Bibliothek ein eigenes Destruktorobjekt mitgeben kann.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725961</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 13 Jun 2009 12:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Test, ob Objekt im Heap oder Stack ist on Sun, 14 Jun 2009 00:21:16 GMT]]></title><description><![CDATA[<p>fqt4 schrieb:</p>
<blockquote>
<p>Wäre es denn sicher, den new-Operator in der Klasse zu überladen, von der ich wissen will, ob sie auf dem Heap liegt. zu überladen und die Addresse abzuspeichern. Nun hat man eine Liste aller auf dem Heap liegenden Objekte; die anderen sind dann auf dem Stack.(?)</p>
</blockquote>
<p>Funktioniert nicht, da das Objekt als Teil eines anderen Objekts erst recht wieder auf dem Heap liegen könnte, ohne dass dein operator new aufgerufen wird.</p>
<p>Und wozu willst du überhaupt eigene smart-pointer basteln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1726201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1726201</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 14 Jun 2009 00:21:16 GMT</pubDate></item></channel></rss>