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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

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

Beitrag von Xethoras »

Gibt es eine Möglichkeit zu überprüfen ob ein Objekt auf dem Stack oder auf dem Heap liegt? (Zur Laufzeit..)
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

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

Beitrag 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
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

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

Beitrag von Xethoras »

Ok, danke.
Anz
Beiträge: 3
Registriert: 05.06.2005, 12:59
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

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

Beitrag von Lord Delvin »

Ich brauch hoffentlich nicht zu erwähnen, dass bei mehreren Threads jeder Stack zu testen ist, oder?
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Anz
Beiträge: 3
Registriert: 05.06.2005, 12:59
Kontaktdaten:

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

Beitrag 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?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

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

Beitrag von Xethoras »

Ich will im Grunde bloß wissen, ob ich es mit delete löschen kann/muss
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag von Aramis »

Wenn du das wissen musst, ist irgendwas in deinem Programmdesign definitiv schiefgelaufen :-)
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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“ :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten