2009-02-22 32 views
2

我最近看到了幾個實際做到這一點的開源項目;從函數返回一個不安全的指針,例如:「int * input = this.someIterator.GetUnsafePtr()」。爲什麼允許從函數內返回不安全的指針?

從我的理解,這必須是完全錯誤的。不安全的指針只能通過'固定'語句獲得,當然從函數內部返回的指針不會再被固定(它們將'丟失'它們的聲明範圍),最終導致它們被垃圾收集。

但是後來我不記得編譯器給出了有關這個的任何警告,那麼爲什麼要使用一個固定的語句,如果你實際上可以有'unpinned'的指針遍佈整個?

回答

2

我從來沒有在開源項目中看到這樣的構造。如果你在你的問題中提供一些這樣的用法的樣本會更好。它的含義可能取決於行爲。
但我同意,不安全的指針是邪惡的,只有當你與一些本地庫或代碼交互時才應該使用。
據我記得,只有在不安全的區塊才能使用這種結構。所以我認爲編譯器在這裏不會給出任何警告。 IMO最好使用IntPtr(不安全塊只能在完全信任下執行)。
編輯:
@Stephen是正確的,IntPtr不會保留對GC收集對象的引用。

+0

IntPtr不是跟蹤指針。如果一個IntPtr引用一個託管對象,並且該對象被移動,則該指針不會被更新。 IntPtr和不安全的指針之間沒有真正的區別,除了IntPtr符合CLS並且不是'不安全'。 – 2009-02-22 13:16:28

3

怎麼樣,Marshal.AllocHGlobalMarshal.AllocCoTaskMem,都返回IntPtr,它可以使用.ToPointer()函數自由投射到void *

或者指針可能來自非託管代碼。你需要fix/pin內存,因爲內存是託管的,因此只要它不是fixed/pinned垃圾收集器可以自由移動它,使指針無效。

相關問題