<?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[delete eines Objekts auf dem Stack]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:</p>
<pre><code>void foo(double my_double)
{
	double *ptr = &amp;my_double;
	delete ptr; // Fehler: _block_type_is_valid(phead- nblockuse)
}

int _tmain(int argc, _TCHAR* argv[])
{
	double *ptr = new double(1.2);
	foo(*reinterpret_cast&lt;double*&gt;(&amp;ptr));
}
</code></pre>
<p>Das Problem ist ja dass ich hier versuche delete auf ein Objekt anzuwenden, welches auf dem Stack liegt. Aber eigentlich liegt das double ja auf dem Heap, wegen dem new. Wie erkläre ich dem Compiler also, dass die Adresse eben doch auf dem Heap und nicht auf dem Stack liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326528/delete-eines-objekts-auf-dem-stack</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Jul 2026 23:48:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326528.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Jun 2014 19:59:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 19:59:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:</p>
<pre><code>void foo(double my_double)
{
	double *ptr = &amp;my_double;
	delete ptr; // Fehler: _block_type_is_valid(phead- nblockuse)
}

int _tmain(int argc, _TCHAR* argv[])
{
	double *ptr = new double(1.2);
	foo(*reinterpret_cast&lt;double*&gt;(&amp;ptr));
}
</code></pre>
<p>Das Problem ist ja dass ich hier versuche delete auf ein Objekt anzuwenden, welches auf dem Stack liegt. Aber eigentlich liegt das double ja auf dem Heap, wegen dem new. Wie erkläre ich dem Compiler also, dass die Adresse eben doch auf dem Heap und nicht auf dem Stack liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405105</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 19:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:03:31 GMT]]></title><description><![CDATA[<p>Nein, es liegt auf dem Stack. Du benutzt call-by-value, also wird der Wert vom Heap-Speicher auf den Stack gelegt, den du da versucht zu deleten. Deine ganzen Casts da sind vollkommen sinnlos.</p>
<p>Sieht alles sehr krank aus. Was hast du wirklich vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405106</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:03:18 GMT]]></title><description><![CDATA[<p>Du übergibst doch eine Kopie von dem double. Wenn, dann musst du einen double* übergeben, das wär dann auch weniger irritierend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405107</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:12:29 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Nein, es liegt auf dem Stack. Du benutzt call-by-value, also wird der Wert vom Heap-Speicher auf den Stack gelegt, den du da versucht zu deleten. Deine ganzen Casts da sind vollkommen sinnlos.</p>
<p>Sieht alles sehr krank aus. Was hast du wirklich vor?</p>
</blockquote>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Du übergibst doch eine Kopie von dem double. Wenn, dann musst du einen double* übergeben, das wär dann auch weniger irritierend.</p>
</blockquote>
<p>Ich weiß dass die casts in diesem Minimal-Beispiel sinnlos erscheinen, aber ich brauche das so.</p>
<p>Die Sache ist die dass ich einen Wrapper in C++ schreibe für ein Programm dass intern das Aufrufen von (speziell dafür kompilierten) C++ Funktionen erlaubt.</p>
<p>Diese C++ Funktionen können aber nur primitive Werte als Parameter nehmen und zurückgeben. Problem ist jetzt, dass ich mit Klassen arbeiten will(muss), ich jedeoch keine Klasseninstanz zurückgeben kann (da nicht primitiv).</p>
<p>Mein Trick also: Ich erstelle eine Klasseninstanz auf dem Heap per new und caste sie in ein double, welches ich zurückgeben darf. Dann benutze ich diese Instanz in einer weiteren Funktion indem ich den gespeicherten double (als Wert!) übergebe und wieder in mein Objekt zurückcaste.</p>
<p>Das klappt auch alles schon. Nur beim löschen happerts noch (ich will die ganzen Instanzen ja auch wieder loswerden können). Das wird durch mein Minimalbeispiel simmuliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405109</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:12:45 GMT]]></title><description><![CDATA[<p>Der Compiler weiß nicht dass das double auf dem stack liegt, das Laufzeitsystem hat gesagt dass dein delete falsch ist und es hat recht.<br />
Du holst dir ein double * per new. Dann tust du so als wäre der double pointer ein double und übergibst es der Funktion. Diese ruft delete mit der Adresse des doubles auf das eigentlich ein double * ist. Ich meine hier ist dein Fehler: Du löscht nicht das double was ein double * ist sondern die Adresse der Stackvariablen.</p>
<pre><code>void foo(double my_double)
{
	double *ptr = *reinterpret_cast&lt;double **&gt;(&amp;my_double);
	cout &lt;&lt; &quot;Nachher: &quot; &lt;&lt; ptr &lt;&lt; '\n';
	delete ptr;
}

int _tmain(int argc, _TCHAR* argv[])
{
	double *ptr = new double(1.2);
	cout &lt;&lt; &quot;Vorher: &quot; &lt;&lt; ptr &lt;&lt; '\n';
	foo(*reinterpret_cast&lt;double*&gt;(&amp;ptr));
}
</code></pre>
<p>Das könnte ausdrücken was du willst. Auf einem 32-Bit-System könntest du Glück haben dass ein double die 32-Bit-Adresse verlustfrei speichern kann und es nicht abstürzt. Wenn vorher == nachher, dann funktioniert das, ansonsten nicht. Und mit &quot;funktioniert&quot; meine ich dass das Undefined Behavior tut was du möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405110</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:15:56 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Das könnte ausdrücken was du willst. Auf einem 32-Bit-System könntest du Glück haben dass ein double die 32-Bit-Adresse verlustfrei speichern kann und es nicht abstürzt. Wenn vorher == nachher, dann funktioniert das, ansonsten nicht. Und mit &quot;funktioniert&quot; meine ich dass das Undefined Behavior tut was du möchtest.</p>
</blockquote>
<p>Ok, das funktioniert schonmal (vorher == nachher), aber das ist jetzt also UB? Kann man das irgendwie vermeiden, also dass es immer klappt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405111</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:27:22 GMT]]></title><description><![CDATA[<p>Ja, call by reference.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405116</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:38:17 GMT]]></title><description><![CDATA[<p>Aber wie soll ich das machen, das Programm für das ich den Wrapper schreibe kennt gar keine Referenzen. In der C++ Schnittstelle kann ich mir nur einen pointer auf eine Kopie des übergebenen Wertes holen, daher muss ich die Adresse in dem Wert des doubles codieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405119</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:41:41 GMT]]></title><description><![CDATA[<p>Wieso ersetzt du das double nicht einfach mit einem double *?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405122</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:41:41 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:46:59 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Wieso ersetzt du das double nicht einfach mit einem double *?</p>
</blockquote>
<p>Wie gesagt, das kann ich nicht. Ich kann nur doubles übergeben und zurückgeben, sonst nichts. Ich muss also aus dem double irgendwie einen validen pointer auf mein Ursprungsobjekt zurückcasten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405124</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:54:20 GMT]]></title><description><![CDATA[<p>Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405126</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 20:56:10 GMT]]></title><description><![CDATA[<p>1. Warum willst du überhaupt den Pointer dort löschen?<br />
ggf. gibt es im Code-Fluss eine besser Stelle?</p>
<p>2. Es gibt doch sicherlich die Möglichkeit globale Variablen zu benutzen?</p>
<pre><code>std::map&lt;double, yourType*&gt; AllYourPointers;
</code></pre>
<p>Dann ist die double Variable eben der Index, dann ist call by value auch egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405128</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Sun, 22 Jun 2014 20:56:10 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 21:01:38 GMT]]></title><description><![CDATA[<p>double als key einer map ist eine schlechte Idee. Rundungsfehler können unvorhersehbare Folgen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405130</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sun, 22 Jun 2014 21:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 21:12:11 GMT]]></title><description><![CDATA[<pre><code>void *alloca(size_t size);
</code></pre>
<p>dann musst du ihn nicht freigeben....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405132</guid><dc:creator><![CDATA[HelloWorldFan]]></dc:creator><pubDate>Sun, 22 Jun 2014 21:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 21:29:35 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.</p>
</blockquote>
<p>ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder?</p>
<p>nurf schrieb:</p>
<blockquote>
<p>2. Es gibt doch sicherlich die Möglichkeit globale Variablen zu benutzen?</p>
<pre><code>std::map&lt;double, yourType*&gt; AllYourPointers;
</code></pre>
<p>Dann ist die double Variable eben der Index, dann ist call by value auch egal.</p>
</blockquote>
<p>Nee, gibts so leider nicht, zumindest nicht über verschiedene Funktionen hinaus. Eine globale Variable kann ich zwar schon anlegen, aber nur innerhalb eines Moduls...</p>
<p>HelloWorldFan schrieb:</p>
<blockquote>
<pre><code>void *alloca(size_t size);
</code></pre>
<p>dann musst du ihn nicht freigeben....</p>
</blockquote>
<p>Aber ich will ja wieder freigeben können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405135</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 22 Jun 2014 21:29:35 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 21:35:18 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder?</p>
</blockquote>
<p>Ich würd eben keine Zeiger übergeben, sondern handles. Könnte z.B. so ausschauen wie bei nurf, also mit einer map&lt;int, object&gt;. In deiner Funktion brauchst du dann eine Möglichkeit, über das Handle an das Objekt zu kommen. Kann vielleicht eine globale Zugriffsfunktion sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405137</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 22 Jun 2014 21:35:18 GMT</pubDate></item><item><title><![CDATA[Reply to delete eines Objekts auf dem Stack on Sun, 22 Jun 2014 21:39:34 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Kannst du nicht mit ints und handles arbeiten? Ich würds noch sauberer finden, wenn der Parameter ein Handle ist.</p>
</blockquote>
<p>ints würde auch gehen, aber das Prinzip würde ja das gleiche bleiben, oder..</p>
</blockquote>
<p>ich würde in dem Fall ein uint64 nehmen und die Adresse damit so übergeben wie NWP3 es bei dem double machst. Ich sehe darin dann auch ein problem bei einer anwendung auf einem 32 bit System..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405139</guid><dc:creator><![CDATA[HelloWorldFan]]></dc:creator><pubDate>Sun, 22 Jun 2014 21:39:34 GMT</pubDate></item></channel></rss>