Seite 1 von 1

[c++] auf Stack/Heap prüfen

Verfasst: 09.05.2009, 15:06
von Xethoras
Gibt es eine Möglichkeit zu überprüfen ob ein Objekt auf dem Stack oder auf dem Heap liegt? (Zur Laufzeit..)

Re: [c++] auf Stack/Heap prüfen

Verfasst: 09.05.2009, 15:44
von Helmut
Im Grunde musst du nur prüfen, ob die Adresse zwischen dem Start und der aktuellen Addresse des Stacks liegt. Hier dürftest du fündig werden.

Dass sich sowas nicht gehört, platform- und compilerabhängig ist, muss ich wohl nicht erwähnen;)

Ciao

Re: [c++] auf Stack/Heap prüfen

Verfasst: 09.05.2009, 17:33
von Xethoras
Ok, danke.

Re: [c++] auf Stack/Heap prüfen

Verfasst: 09.05.2009, 17:48
von Anz
Du könntest den Pointer mit delete löschen und falls das Programm abstürzt war der Speicher auf dem Stack :D

Mit Inline Assembler kann man die Stackgrösse herausfinden und dann wie Helmut geschrieben hat die Adressen vergleichen. Damit wäre Code nicht mehr Betriebsystem und Compiler abhänig, sondern hängt nur noch vom verwendeten Prozessor ab, wie man die Stackgrösse ermittelt (was weit weniger sind als alle OS und Compiler kombinationen).
Einfach mal nach stack size googeln.

Aber falls du ohne hin nur unter Windows arbeitest lohnt sich dieser Aufwand für dich wahrscheinlich nicht.

Re: [c++] auf Stack/Heap prüfen

Verfasst: 09.05.2009, 19:06
von Lord Delvin
Ich brauch hoffentlich nicht zu erwähnen, dass bei mehreren Threads jeder Stack zu testen ist, oder?

Re: [c++] auf Stack/Heap prüfen

Verfasst: 10.05.2009, 00:52
von Anz
hm jeder Thread hat zwar seinen eigenen Stack, aber haben die nicht alle die selbe Grösse?

*edit*
Der Adressraum ist logischer Weise unterschiedlich und somit ist es wohl wirklich notwendig dies pro Thread zu machen.

Mir ist gerade eine andere Möglichkeit eingefallen. Der Stackpointer liegt beim x86 ja in einem Register. Falls die Zeigeradresse grösser (bzw. kleiner) ist als der aktuelle Stackpointer müsste der Speicher im Heap liegen oder täusche ich mich?

Re: [c++] auf Stack/Heap prüfen

Verfasst: 10.05.2009, 11:09
von Schrompf
Ich finde allgemein kreuzgefährlich, was Du da vorhast... was genau planst Du denn mit der Information, ob ein Objekt auf dem Stack oder Heap angelegt wurde. Placement new wirst Du da wahrscheinlich gar nicht berücksichtigen wollen.

Re: [c++] auf Stack/Heap prüfen

Verfasst: 10.05.2009, 21:52
von Xethoras
Ich will im Grunde bloß wissen, ob ich es mit delete löschen kann/muss

Re: [c++] auf Stack/Heap prüfen

Verfasst: 10.05.2009, 21:59
von Aramis
Wenn du das wissen musst, ist irgendwas in deinem Programmdesign definitiv schiefgelaufen :-)

Re: [c++] auf Stack/Heap prüfen

Verfasst: 10.05.2009, 22:04
von Krishty
Es geht um delete this;, oder? Das habe ich schon öfter gesehen … hat dieses Design auch einen Namen?

Mir fällt dazu nur ein, dass das Objekt sich nicht selbst erzeugt hat, also auch nicht selbst zerstören sollte. Das macht ja nicht nur mit dem Stack Probleme, sondern auch mit dynamischen Arrays usw … das sollte nicht so sein.

Re: [c++] auf Stack/Heap prüfen

Verfasst: 11.05.2009, 00:12
von Aramis
'delete this' ist IMHO nicht generell böse, aber meist. Das einzige gute Beispiel dass mir einfällt ist ein im Objekt selber implementierter Referenzzähler, wie beispielsweise in COM.

Code: Alles auswählen

void PopRef() {
    if (--refcnt == 0)
        delete this;
}
Solche Objekte *dürfen* dann eben einfach nicht auf dem Stack liegen. Dort kann ja gerne ein (intrusiver) Smart-Pointer liegen, der das Weglöschen de-facto übernimmt. Aber nicht das Objekt selber.

Ein Name ist mir nicht bekannt. Ich würde es 'Suizid-Pattern' nennen.

Re: [c++] auf Stack/Heap prüfen

Verfasst: 11.05.2009, 12:55
von Krishty
Aramis hat geschrieben:Das einzige gute Beispiel dass mir einfällt ist ein im Objekt selber implementierter Referenzzähler, wie beispielsweise in COM.
Stimmt, da muss ich das auch gesehen haben.
Aramis hat geschrieben:Ich würde es 'Suizid-Pattern' nennen.
Wenn man es falsch macht, eher „Timebomb-Pattern“ :)