What kind of pointer returned if I use "&" to get address of a value type in C++\CLI?
假设我写了以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public ref class Data { public: Data() { } Int32 Age; Int32 year; }; public void Test() { int age = 30; Int32 year = 2010; int* pAge = &age; int* pYear = &year; Data^ data = gcnew Data(); int* pDataYear = &data->Year; // pData is interior pointer and the compiler will throw error } |
如果你编译程序,编译器会抛出错误:
错误 C2440:"正在初始化":无法从"cli::interior_ptr"转换为"int *"
于是我学会了"
它们(
将托管数据复制到堆栈,然后将其传递给本机函数,在许多情况下解决了 gc-moving-managed-data-around 问题(当然,不要将它与期望原始变量的回调一起使用)在您的package器有机会将值复制回来之前进行更新)。
要获得指向托管数据的本机指针,您必须使用固定指针。这可能比将值复制到堆栈的方法要慢,因此对于较大的值或确实需要函数直接对同一个变量进行操作时使用它(例如,该变量用于回调或多线程)。
类似:
1 | pin_ptr<int> p = &mgd_obj.field; |
另见 MSDN 文档