<?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[Klassenpointer zu void* mit anschließendem delete]]></title><description><![CDATA[<p>Hi leute, ich muss wegen einer funktion wegen threading einen klassen pointer (kann zur not auch eine strukture machen, wenn das ganze damit besser bzw. schneller läuft) in einen void pointer wandeln.<br />
Ich dachte daran an einen simplen cast mittels (void <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="😉"
    /> (ja ich mag den c-style lieber <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ).<br />
Folgendes bsp. soll das ganze erläutern:</p>
<pre><code>...
    MeineKlasse *ptr = new MeineKlasse(&quot;arg1&quot;, &quot;arg2&quot;) /* &quot;arg2&quot; ist in wirklichkeit eine Struktur */
    MeineFunktionDieEinenVoidPtrBraucht(MeineFunktion, (void *)ptr);
}

void MeineFunktion(void *MeineKlasseAlsVoidPtr) {
    MeineKlasse *ptr = (MeineKlasse *)MeineKlasseAlsVoidPtr;
    ... /* ptr wird benutzt und sonstige funktionen werden aufgerufen *
         * Das ganze läuft übrigens Threaded ab                       *
         * (wegen Funktion &quot;MeineFunktionDieEinenVoidPtrBraucht&quot;      */
    delete ptr;
}
</code></pre>
<p>Meine Fragen:<br />
1.) Gibt es eine elegantere methode das ganze zu casten?<br />
2.) Wird das 'delete ptr' ordentlich funktionieren, also das &quot;rückcasten&quot; so funktionieren, dass dannach keine Speicherlöcher entstehen?</p>
<p>MfG Krauzi.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263243/klassenpointer-zu-void-mit-anschließendem-delete</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 21:36:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263243.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Mar 2010 17:04:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassenpointer zu void* mit anschließendem delete on Wed, 17 Mar 2010 17:04:01 GMT]]></title><description><![CDATA[<p>Hi leute, ich muss wegen einer funktion wegen threading einen klassen pointer (kann zur not auch eine strukture machen, wenn das ganze damit besser bzw. schneller läuft) in einen void pointer wandeln.<br />
Ich dachte daran an einen simplen cast mittels (void <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="😉"
    /> (ja ich mag den c-style lieber <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ).<br />
Folgendes bsp. soll das ganze erläutern:</p>
<pre><code>...
    MeineKlasse *ptr = new MeineKlasse(&quot;arg1&quot;, &quot;arg2&quot;) /* &quot;arg2&quot; ist in wirklichkeit eine Struktur */
    MeineFunktionDieEinenVoidPtrBraucht(MeineFunktion, (void *)ptr);
}

void MeineFunktion(void *MeineKlasseAlsVoidPtr) {
    MeineKlasse *ptr = (MeineKlasse *)MeineKlasseAlsVoidPtr;
    ... /* ptr wird benutzt und sonstige funktionen werden aufgerufen *
         * Das ganze läuft übrigens Threaded ab                       *
         * (wegen Funktion &quot;MeineFunktionDieEinenVoidPtrBraucht&quot;      */
    delete ptr;
}
</code></pre>
<p>Meine Fragen:<br />
1.) Gibt es eine elegantere methode das ganze zu casten?<br />
2.) Wird das 'delete ptr' ordentlich funktionieren, also das &quot;rückcasten&quot; so funktionieren, dass dannach keine Speicherlöcher entstehen?</p>
<p>MfG Krauzi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1870484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1870484</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 17 Mar 2010 17:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenpointer zu void* mit anschließendem delete on Wed, 17 Mar 2010 17:16:46 GMT]]></title><description><![CDATA[<p>Das ist eine relative häufig verwendete Methode bei C Callback funktionen. z.B. in der WinAPI, (oder war früher auch so bei SQLite2.x), uvm</p>
<p>er erste cast</p>
<pre><code class="language-cpp">MeineFunktionDieEinenVoidPtrBraucht(MeineFunktion, (void *)ptr);
</code></pre>
<p>sollte unnötig sein wenn sie einen void Zeiger erwartet.</p>
<p>Ansonsten bleibt dir da nicht viel anderes übrig als das so oder zumindest so ähnlich umzusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1870490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1870490</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 17 Mar 2010 17:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenpointer zu void* mit anschließendem delete on Wed, 17 Mar 2010 17:18:26 GMT]]></title><description><![CDATA[<p>Krauzi schrieb:</p>
<blockquote>
<p>1.) Gibt es eine elegantere methode das ganze zu casten?</p>
</blockquote>
<p>Ja, gar nicht, T* -&gt; void* geht implizit. Aber grundsätzlich sind die C++-Cast-Operatoren eleganter, weil typsicherer.</p>
<p>Krauzi schrieb:</p>
<blockquote>
<p>2.) Wird das 'delete ptr' ordentlich funktionieren, also das &quot;rückcasten&quot; so funktionieren, dass dannach keine Speicherlöcher entstehen?</p>
</blockquote>
<p>Sofern der Originaltyp derselbe ist, ja.</p>
<p>Aber es ist unschön, wenn die Funktion sich um die Speicherfreigabe kümmern muss. Warum macht das nicht der Aufrufer, der den Speicher auch angefordert hat?</p>
<p>Krauzi schrieb:</p>
<blockquote>
<p>klassen pointer (kann zur not auch eine strukture machen, wenn das ganze damit besser bzw. schneller läuft)</p>
</blockquote>
<p>Die Änderung des Schlüsselworts hat keinen Einfluss auf die Performance. Bei modernen Compilern hat dies nicht einmal der Umstand, ob Funktionen statt direktem Memberzugriff verwendet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1870491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1870491</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Mar 2010 17:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenpointer zu void* mit anschließendem delete on Wed, 17 Mar 2010 22:20:36 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber es ist unschön, wenn die Funktion sich um die Speicherfreigabe kümmern muss. Warum macht das nicht der Aufrufer, der den Speicher auch angefordert hat?</p>
</blockquote>
<p>Es gibt Fälle, wo es nicht anders geht, bzw. einfach Sinn macht.<br />
z.B. wenn man einen Thread startet, dem man eine kleine &quot;was soll ich eigentlich machen&quot; Struktur mitgibt.<br />
Damit dieser &quot;detached&quot; laufen kann, muss er die &quot;Ownership&quot; der Struktur übernehmen, und damit muss er sich auch freigeben.<br />
Und meist ist es ausreichend da dann einen (evtl. virtuellen) Destruktor mittels delete aufzurufen. Man <em>kann</em> zu dem Zweck aber natürlich auch eine spezielle (virtuelle) &quot;lösch mich&quot; Funktion bauen. Bringt aber nur was, wenn man es u.U. mit Strukturen zu tun hat, die nicht über den globalen Operator delete entsorgt werden sollten (placement new, Pools, ...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1870639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1870639</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 17 Mar 2010 22:20:36 GMT</pubDate></item></channel></rss>