<?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[Typ eines Pointers (auf eine Klasse) ermitteln]]></title><description><![CDATA[<p>Ich habe bereits verschiedene Varianten versucht, aber es funktioniert alles nicht so wirklich. Meine Absicht ist es, einen Pointer zu einer Klasseninstanz zu casten und danach noch zu prüfen, ob das auch tatsächlich ein Pointer auf die Klasse war, um ein <code>SIGSEGV</code> zu verhindern.</p>
<p>Meine erste Variante war per dynamic_cast. Jedoch wurde auch alles als gültig durchgewunken, was die gleiche Menge oder weniger Speicher belegte.<br />
Danach versuchte ich es mit <code>typeinfo.h</code> . Aber auch das funktioniert nicht, da ich den <code>void*</code> -Pointer ja caste und <code>typeid()</code> mir entweder erzählt, dass ich einen <code>void*</code> -Pointer (wenn ohne Cast) habe oder den &quot;richtigen&quot; Typ annimmt (aufgrund des Casts) auch wenn ich bspw. <code>NULL</code> gecastet hatte.</p>
<p>Ich versuchte auch, via <code>signal.h</code> ein mögliches <code>SIGSEGV</code> auszulösen (in dem eine Methode der Klasse über den gecasteten Pointer aufrufe, ohne vorher auf Gültigkeit zu prüfen und bei <code>SIGSEGV</code> ein bool zu setzen) und das Signal an sich einfach zu ignorieren, jedoch ist auch das nicht gelungen.</p>
<p>Als Beispiel:</p>
<pre><code>MyClass toVoid;
void* pointer = &amp;toVoid;

[...] /* hier könnte pointer sich ändern, toVoid ist auf jeden Fall bereits ungültig */

MyClass *mc = (MyClass*) pointer;
if (/* mc == MyClass */) {
    // verwende den Pointer
} else {
    // mache was anderes
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/335166/typ-eines-pointers-auf-eine-klasse-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 21:02:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335166.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Nov 2015 13:09:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 13:09:40 GMT]]></title><description><![CDATA[<p>Ich habe bereits verschiedene Varianten versucht, aber es funktioniert alles nicht so wirklich. Meine Absicht ist es, einen Pointer zu einer Klasseninstanz zu casten und danach noch zu prüfen, ob das auch tatsächlich ein Pointer auf die Klasse war, um ein <code>SIGSEGV</code> zu verhindern.</p>
<p>Meine erste Variante war per dynamic_cast. Jedoch wurde auch alles als gültig durchgewunken, was die gleiche Menge oder weniger Speicher belegte.<br />
Danach versuchte ich es mit <code>typeinfo.h</code> . Aber auch das funktioniert nicht, da ich den <code>void*</code> -Pointer ja caste und <code>typeid()</code> mir entweder erzählt, dass ich einen <code>void*</code> -Pointer (wenn ohne Cast) habe oder den &quot;richtigen&quot; Typ annimmt (aufgrund des Casts) auch wenn ich bspw. <code>NULL</code> gecastet hatte.</p>
<p>Ich versuchte auch, via <code>signal.h</code> ein mögliches <code>SIGSEGV</code> auszulösen (in dem eine Methode der Klasse über den gecasteten Pointer aufrufe, ohne vorher auf Gültigkeit zu prüfen und bei <code>SIGSEGV</code> ein bool zu setzen) und das Signal an sich einfach zu ignorieren, jedoch ist auch das nicht gelungen.</p>
<p>Als Beispiel:</p>
<pre><code>MyClass toVoid;
void* pointer = &amp;toVoid;

[...] /* hier könnte pointer sich ändern, toVoid ist auf jeden Fall bereits ungültig */

MyClass *mc = (MyClass*) pointer;
if (/* mc == MyClass */) {
    // verwende den Pointer
} else {
    // mache was anderes
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2473937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473937</guid><dc:creator><![CDATA[Kolos]]></dc:creator><pubDate>Tue, 03 Nov 2015 13:09:40 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 13:19:53 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">/* hier könnte pointer sich ändern, toVoid ist auf jeden Fall bereits ungültig */
</code></pre>
</blockquote>
<p>Dann ist auch die Adresse ungültig und alles weitere erübrigt sich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473938</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 03 Nov 2015 13:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 13:30:23 GMT]]></title><description><![CDATA[<p>Die Frage, ob sich an einer bestimmten Stelle des Speichers ein Objekt eines bestimmten Typs befindet oder nicht, ist allgemein nicht durch die Untersuchung des Speichers selbst herauszufinden, da sie allein durch die Reihenfolge der abgearbeiteten Anweisungen bestimmt ist.<br />
Eine qualifizierte Ausnahme dazu besteht nur im Fall von polymorphen Objekten i.V.m. dynamic_cast, aber auch dann ist Voraussetzung, dass der Programmierer über die Existenz des polymorphen Objektes nicht lügt.</p>
<p>Hinzu kommt, dass in den meisten Fällen der Zeiger auf Objekte, die zerstört wurden, nicht mehr auf einen bestimmte Stelle zeigt, und damit bereits der Versuch, Speicher zu untersuchen, scheitern muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473940</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 03 Nov 2015 13:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 13:34:02 GMT]]></title><description><![CDATA[<p>Guter Einwand, das habe ich falsch dargestellt. So müsste es dann richtig sein:</p>
<pre><code>MyClass *toVoid = new MyClass;
void* pointer = toVoid; // Kopie von toVoid

[...] /* hier könnte pointer sich ändern, toVoid ist auf jeden Fall bereits ungültig */

MyClass *mc = (MyClass*) pointer;
if (/* mc == MyClass */) {
    // verwende den Pointer
} else {
    // mache was anderes
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: Also MyClass hat ein paar virtuelle Methoden, die auch an andere Klassen vererbt werden. Mit der Existenz verstehe ich nicht ganz. Muss ich also zu hundert Prozent wissen, dass <code>pointer</code> noch auf ein Objekt von <code>MyClass</code> zeigt? Weil dann wäre das ja genau der Fall, der bei mir nicht zutrifft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473941</guid><dc:creator><![CDATA[Kolos]]></dc:creator><pubDate>Tue, 03 Nov 2015 13:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 14:33:04 GMT]]></title><description><![CDATA[<p>void* ist eine blöde Idee. Du musst wissen, was drin steht, um es wieder in den passenden Typ zu casten. Möglicherweise wäre boost::any eine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473949</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 03 Nov 2015 14:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 15:06:55 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>void* ist eine blöde Idee.</p>
</blockquote>
<p>Da ist mir die Idee gekommen, dass in einem <code>LONG_PTR</code> zu speichern.</p>
<pre><code>#define LONG_IS_MYCLASS    1

MyClass *toVoid = new MyClass;
LONG_PTR pointer = MAKELONG (toVoid, LONG_IS_MYCLASS);

[...] /* hier könnte pointer sich ändern, toVoid ist auf jeden Fall bereits ungültig */

if (HIWORD (pointer) == LONG_IS_MYCLASS) {
    MyClass *mc = (MyClass*) LOWORD (pointer);
} else {
    // mache was anderes
}
</code></pre>
<p>Wäre das (in der Form unter Windows) gültig? Bzw. ginge das auch plattformunabhängig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473959</guid><dc:creator><![CDATA[Kolos]]></dc:creator><pubDate>Tue, 03 Nov 2015 15:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 15:31:06 GMT]]></title><description><![CDATA[<p>Nein. Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473969</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 03 Nov 2015 15:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 16:01:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Hinzu kommt, dass in den meisten Fällen der Zeiger auf Objekte, die zerstört wurden, nicht mehr auf einen bestimmte Stelle zeigt, […]</p>
</blockquote>
<p>Was meinst du mit &quot;zeigen&quot; und &quot;Stelle&quot;? Nachdem das Objekt zerstört worden ist, ist &quot;zeigen&quot; (welches als Gegenstück des normativen &quot;point&quot; fungiert) zwar spätestens seit N4430 tatsächlich das falsche Verb, aber du hast bestimmt die Repräsentierung der Adresse der region of storage gemeint, und die ist noch gegeben solange der Speicher gültig ist (i.e. die duration der region of storage währt) - schließlich können wir ein neues Objekt konstruieren, o.ä.<br />
Sobald der Speicher ungültig wird, hat jeder entsprechende Zeiger einen ungültigen Wert, und er zeigt nicht und repräsentiert auch keine Adresse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2473985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2473985</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 03 Nov 2015 16:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 16:56:11 GMT]]></title><description><![CDATA[<p>Das was Du vorhast funktioniert wenn Du Deine Klassen von einer gemeinsamen Vorfahrklasse ableitest. Einen Zeiger auf diese Vorfahrklasse kannst Du dann per dynamic_cast casten und es verhält sich so wie Du es erwartest.</p>
<p>ABER: Die Notwendigkeit des Castens deutet in den allermeisten Fällen auf einen Designfehler hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474003</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Tue, 03 Nov 2015 16:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 17:31:44 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Hinzu kommt, dass in den meisten Fällen der Zeiger auf Objekte, die zerstört wurden, nicht mehr auf einen bestimmte Stelle zeigt, […]</p>
</blockquote>
<p>Was meinst du mit &quot;zeigen&quot; und &quot;Stelle&quot;? Nachdem das Objekt zerstört worden ist, ist &quot;zeigen&quot; (welches als Gegenstück des normativen &quot;point&quot; fungiert) zwar spätestens seit N4430 tatsächlich das falsche Verb, aber du hast bestimmt die Repräsentierung der Adresse der region of storage gemeint, und die ist noch gegeben solange der Speicher gültig ist (i.e. die duration der region of storage währt) - schließlich können wir ein neues Objekt konstruieren, o.ä.<br />
Sobald der Speicher ungültig wird, hat jeder entsprechende Zeiger einen ungültigen Wert, und er zeigt nicht und repräsentiert auch keine Adresse.</p>
</blockquote>
<p>Ich meine mit <em>meistens</em>, dass auf die Zerstörung eines Objektes typischerweise die Freigabe des entsprechenden Speichers unmittelbar folgt (delete, automatische Objekte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474012</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 03 Nov 2015 17:31:44 GMT</pubDate></item><item><title><![CDATA[Reply to Typ eines Pointers (auf eine Klasse) ermitteln on Tue, 03 Nov 2015 17:50:04 GMT]]></title><description><![CDATA[<p>Danke für die Anregungen. Da werde ich dann wohl eine andere Möglichkeit finden müssen ( <code>boost::any</code> wurde ja bspw. genannt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2474021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2474021</guid><dc:creator><![CDATA[Kolos]]></dc:creator><pubDate>Tue, 03 Nov 2015 17:50:04 GMT</pubDate></item></channel></rss>