2015-11-19 40 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); 

注意,指针的地址通过,不超过如有不同你想让函数通过传递变量的地址来改变非指针变量。