2012-12-21 24 views
0

我想構建一個cli/C++ ref類。這個類的目的是用一些功能包裝一個本地類指針。本地類指針由黑盒工廠方法提供給我。對於我的生活,我不知道如何固定原生指針,所以它不會移動。這裏是代碼的情況下(這麼說):問題與interior_ptr pin_ptr

public ref class ManagedFoo{ 
    private: 
     NativeFooClass* myFoo; 
    public: 
     ManagedFoo(){ 
      NativeFooFactory factory(); 
      NativeFooClass* nativePtr = factory.CreateFoo(); 
      //here is where i get lost 
      //create a pined pointer to the nativePtr 
      pin_ptr<NativeFooClass*> pinPtr = &nativePtr; 
      //tring to assign pinPtr to the mamaber var= compilation faliuer 
      myFoo = pinPtr; 
     } 
} 

我不斷收到: 錯誤C2440: '=':無法從 'cli的:: pin_ptr' 到 'NativeFooClass *'

我轉換認爲編譯器對待它們是一樣的嗎?我需要靜態投射嗎?這似乎不正確?

我試圖固定這個指針的原因是因爲當我嘗試在一個方法中使用它,然後從C#中調用此方法時,出現AccessViolation運行時錯誤「{」試圖讀取或寫入受保護的內存。這通常表示其他內存已損壞。「}」

回答

2

您不需要。本機對象存儲在內存中,而不是由.NET垃圾回收器管理 - 它們不會被移動,並且固定不起作用。

只需

ManagedFoo() 
    { 
     NativeFooFactory factory; // fixed most-vexing parse 
     myFoo = factory.CreateFoo(); 
    } 

應該足夠了。

甚至更​​好

ManagedFoo() 
     : myFoo{NativeFooFactory().CreateFoo()} 
    { 
    } 

更新:由於我們找出對象不能活得比它的工廠,

ManagedFoo() 
     : myFooFactory{new NativeFooFactory()} 
     , myFoo{myFooFactory->CreateFoo()} 
    { 
    } 

雖然我會建議某種智能指針,以確保本機對象正確釋放,也許我的clr_scoped_ptr

+0

我的印象是,當我在不同的方法中使用本機ptr時,我需要pin bc我得到運行時間內存錯誤: 「嘗試讀取或寫入受保護的內存,這通常表示其他內存是腐敗。」 – Dmitry

+0

@Dmitry:那麼你需要看看對象的生命週期,而不是釘住。對象是否允許比創建它們的工廠壽命更長?現在工廠立即超出範圍。 –

+0

本·你是對的!工廠的使用壽命影響指針的使用壽命。 – Dmitry