【问题标题】:using pointers in managed C++ in non-managed library methods在非托管库方法中使用托管 C++ 中的指针
【发布时间】:2015-11-19 23:12:27
【问题描述】:

我有一个用于非托管 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 库使用的相同地址?或者也许我需要为此使用某种元帅方法,或者我可能会遗漏其他陷阱?

【问题讨论】:

  • 指针dataPointer 未初始化。 getDataFromNonmanagedCLibrary 可以用它做什么,除了检查它是否为 NULL?它当然不能初始化它,因为它是按值传递的。

标签: c++ .net c managed-c++


【解决方案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);

注意传递的是指针的地址,这与你想让函数通过传递变量的地址来更改非指针变量没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2011-10-03
    相关资源
    最近更新 更多