你好那里的編碼員,
我有一個關于 C# 指標的問題。我不知道該怎么做才能讓代碼運行。
所以,在我的 WPF 專案中有MainViewModel一個包含一個 IntPtr 的類。
private IntPtr m_context;
從 C 介面加載資料時會填充此背景關系(該介面執行“回傳新的 class_name()”)。我這樣稱呼它:
this.m_context = interface_context_create();
在使用時,我想洗掉背景關系。這也是一種介面方法。我希望它以與上面的創建相同的方法呼叫 (!!):
unsafe
{
interface_context_free(&this.m_context);
}
在interface_context_free(..)c 介面端獲得一個 class_name**,所以這就是我需要使用 & 的原因。我的 C# 端的介面是正確的,因為我的test1()方法(見下文)確實可以正確創建和釋放。
這給出了interface_context_free(&this.m_context);以下錯誤:
CS:0212 您只能在固定陳述句初始化程式中獲取未固定運算式的地址
如果我這樣宣告它,那么它絕對可以正常作業!!!:
public void test1()
{
IntPtr iptr = interface_context_create();
unsafe
{
interface_context_free(&iptr);
}
}
我怎樣才能免費m_context,這兩種情況之間的區別在哪里?
uj5u.com熱心網友回復:
這實際上是一個非常簡單的修復。
您不能這樣做的原因&this.m_context是該變數在記憶體中未固定。因此,當您在非托管空間中浮動的變數的地址時,GC 可能會啟動并將該變數移動到其他地方,從而使該地址無效。如果包含該欄位的物件實體在m_context垃圾回收周期中幸存下來并因此被提升到新一代并因此移動到新的記憶體位置,則可能會發生這種情況。
修復非常簡單:首先將 IntPtr 值復制到區域變數中。堆疊上的變數不會四處移動并且獲取它們的地址是可以的,只要您不讓該地址超出變數的范圍即可。
所以代替這個:
unsafe
{
interface_context_free(&this.m_context);
}
這樣做:
unsafe
{
IntPtr temp = this.m_context;
interface_context_free(&temp);
}
請注意,如果interface_context_free函式使用指向變數的指標的原因是它不僅釋放了從變數參考的物件,而且還修改了變數內容本身,例如將其設定為指向null,您將不得不復制修改后的臨時變數回到現場:
unsafe
{
IntPtr temp = this.m_context;
interface_context_free(&temp);
this.m_context = temp;
}
uj5u.com熱心網友回復:
它與垃圾收集器有關。您應該將欄位標記為不移動以進行 GC。
fixed (void* myIntPtr = &intPtr)
{
interface_context_free(&myIntPtr);
}
此處的詳細資訊: https ://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/fixed-statement
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430725.html
上一篇:“檢測到堆疊粉碎”的原因是什么?
下一篇:c 中帶有陣列的指標的奇怪行為
