2011-03-25 70 views
1

我想寫一個變量監視類,允許我通過它一個指針(理想情況下void *)尋址通常會完全超出範圍或者班級無法進入。然後該類將在屏幕上週期性地顯示該內存位置的內容 - 以用戶定義的方式解釋(例如。(int *))。我只會使用這個指針從內存中讀取數據,它會作爲一個骯髒的破解,在開發期間爲我在運行時暫時感興趣的變量開發一種監視窗口 - 而不需要引入大量代碼這些變量在範圍/類可訪問。使用無效的指針/內存地址:C++(windows)

我正在使用VC++ 2010,它似乎拒絕讓我甚至寫出一個超出範圍的內存位置地址的指針。

我想在windows下有很多事情要做,因爲這種方法在內存位置改變時可能具有非常有限的適用性,但我使用本機C++,因此希望我的地址足夠持久以便有用。此外,我可以看到,它不會像我訪問一個內存位置,我的程序實際上沒有實際使用的安全原因...

任何想法我可以做到這一點? (我意識到使用這樣的指針會產生未定義的行爲,所以只會從中讀取並顯示值)。

謝謝。

+2

以什麼方式VC++拒絕讓你做到這一點?也就是說,到目前爲止您嘗試了什麼?你應該只能說「void * x =(void *)12345;」 – 2011-03-25 13:52:38

+0

如果你的目標是觀察你自己的變量,你爲什麼要訪問你沒有使用的內存?這沒有任何意義。 – 2011-03-25 13:54:29

+0

丹尼爾,我正在使用它 - 但例如它可能是堆棧上的地址,或刪除的堆地址。我使用它的方式 - 我不指望它會消失,但理論上它可以... – ChrisJH 2011-03-25 14:02:14

回答

1

試圖取消引用指向外部任何空間的指針都是非常沒有意義的。您可能訪問的地址甚至可能不會映射到進程的內存空間,因此實際上甚至沒有可以查看的內容。
當您的流程開始時,您實際上並沒有4 GB可供您使用。內存空間大小爲4 GB,但主要由未映射到您的進程的空洞組成。

最終這一切都歸結到你想要使用的指針的位置。內存地址,你通常可以賬戶可能來自:

  • 堆分配 - 通過mallocnew,尚未free d或deleted
  • 堆棧空間,全局變量分配的範圍內的任何東西 - 任何你在程序中的當前位置範圍內定義爲程序中的變量。訪問其他作用域中定義的任何內容都是沒有意義的(例如,從函數返回指向局部變量的指針)
  • 代碼段 - 內存中包含未卸載的進程的DLL或EXE的內存段的地址。通常您只能以只讀訪問權限訪問它們。您可以通過查找函數的返回地址來找到這樣的地址。

在剛剛釋放的內存塊中訪問指針正是這種無意義的情況。一旦您釋放了內存,就有一定的可能性,它已經返回到操作系統,並且該地址不再映射到您的進程。

您可以進一步瞭解這個here

+0

感謝您 - 我希望它會比原來的稍微沒有意義...我必須以艱難的方式去做... – ChrisJH 2011-03-25 15:03:28