Nun, ich stimme zu, es gibt wahrscheinlich eine bessere Art zu tun, was Sie versuchen zu tun. Aber es ist sowieso eine interessante Frage. Also um der Diskussion willen ...
Erstens gibt es keine Möglichkeit, dies zu tun, ist portable C oder C++. Sie müssen zur Baugruppe mit mindestens einem asm{ }
Block fallen.
Zweitens würde ich das nicht im Produktionscode verwenden. Aber für VC++/x86 können Sie herausfinden, ob eine Variable auf Ihr Stapel ist, indem Sie überprüfen, dass seine Adresse zwischen den Werten ESP und EBP Register ist.
Ihr ESP (Extended Stack Pointer, der niedrige Wert) hält die Spitze Ihres Stapels und der EBP (Extended Base Pointer) den unteren Teil. Hier ist die Structure of the Call Stack auf x86.
Aufruf Konvention wird vor allem Funktionsparameter beeinflussen, und wie die Rücksendeadresse behandelt wird, usw. Es bezieht sich also nicht auf Ihren Stapel viel. Für Ihren Fall sowieso nicht.
Was Dinge ablenkt, sind Compiler-Optimierungen. Ihr Compiler kann den Rahmenzeiger (EBP) auslassen. Dies ist die -Oy flag in VC++. Anstatt den EBP als Basiszeiger zu verwenden, können Sie die Adresse von Funktionsparametern verwenden, falls Sie welche haben. Da sind die etwas höher auf dem Stack.
Aber was ist, wenn die Variable, die Sie testen, auf dem Stack Ihres Aufrufers ist? Oder ein Caller-Stack mehrere Generationen über dir? Nun, Sie können den gesamten Call-Stack laufen, aber Sie können sehen, wie dies sehr hässlich werden kann (als ob es nicht schon ist :-))
Da Sie leben gefährlich, ist eine andere Compiler-Flag, die Sie interessieren könnte - Gh flag. Mit diesem Flag und einer geeigneten _penter Hook-Funktion können Sie diese Berechnungen für die Funktionen oder Dateien oder Module usw. einfach einrichten. Aber bitte tu das nicht, es sei denn, du möchtest nur sehen, wie die Dinge funktionieren.
Herauszufinden, was auf dem Heap ist noch schlimmer ....
Abgesehen von "in die Montage Sturz- und überprüfen es" keine Antwort in mir klar. Außerdem ist die Frage seltsam genug, um zu vermuten, dass Sie etwas unnötig Ungewöhnliches tun könnten. Vielleicht sogar falsch. Die Chancen, gute Hilfe zu bekommen, erhöhen sich, wenn Sie ein wenig ... – dmckee
Die Gründe, dies zu tun, könnten Sie zu einer echten Lösung für Ihr Problem führen ... StackOverflow hilft nicht wirklich dabei, es sei denn, Sie fragen mehr allgemeine Frage wie "Gibt es einen besseren Weg, dies zu tun". – Kieveli
Sie müssen Smart Pointer und Referenzübergabe betrachten. Es sieht so aus, als ob Sie versuchen, ein Paradigma aus einer anderen Sprache zu holen, die nicht in die C++ Welt passt. Der Benutzer eines Objekts sollte sich nicht darum kümmern, wo es zugeordnet ist. Wenn Sie das Objekt nur per Referenz bearbeiten möchten. Wenn Sie das Eigentumsrecht übernehmen wollen, übergeben Sie einen auto_ptr. Wenn es Ihnen nichts ausmacht zu teilen, verwenden Sie eine shared_ptr –