2015-11-19 64 views
-1

我有一個託管C++包裝類用於非託管C庫。我遇到了一個問題,看起來我從託管的C++類發送的指針沒有指向非託管C代碼庫方法使用的相同內存位置。在非託管庫方法中使用託管C++中的指針

MyNonManagedType* dataPointer; 
getDataFromNonmanagedCLibrary(dataPointer); 
// this gives me junk data, where field should be a char array 
String^ myFieldValue = gcnew String(dataPointer->field); 

dataPointer是否可能指向C庫使用的相同地址?或者也許我需要使用某種元帥方法,或者我可能缺少其他陷阱?

+0

指針'dataPointer'未初始化。什麼可以'getDataFromNonmanagedCLibrary'處理它,除了檢查它是否爲NULL?它肯定無法初始化它,因爲它是按值傳遞的。 – PaulMcKenzie

+0

可能的重複:--http://stackoverflow.com/questions/32705042/c-program-crashes-when-method-return-value-is-assigned-to-an-int – PaulMcKenzie

回答

1

如果指針沒有被管理,給你顯示的代碼,也沒有辦法爲C功能做的未初始化的指針任何東西,除了兩種:

  1. 檢查它爲NULL,如果是這樣,什麼都不要做,或者
  2. 使用通過的地址,併發生災難。

您正在通過值傳遞指針,並通過值傳遞意味着函數將使用傳遞的參數的本地副本,因此您看到函數返回時沒有更改。該函數不能設置指針,並將這些更改反映回調用方的現在。

因爲我們正在談論的是一個C接口,你應該C接口改成這樣:

void getDataFromNonmanagedCLibrary(MyNonManagedType**); 

的指針指針傳遞。由於我們想要改變傳遞給函數的值並將其反射回調用者,因此會傳遞一個指向該值的指針。由於該值恰好是一個指針,我們將一個指針傳遞給指針。

然後你重寫getDataFromNonmanagedCLibrary提領它來初始化指針:

void getDataFromNonmanagedCLibrary(MyNonManagedType** ptr) 
{ 
    *ptr = <the_address_you_expected_on_return>; 
} 

然後在客戶端:

MyNonManagedType* dataPointer; 
getDataFromNonmanagedCLibrary(&dataPointer); 

注意,指針的地址通過,不超過如有不同你想讓函數通過傳遞變量的地址來改變非指針變量。