我是 C++/CLI 的新手。
我已经知道 pin_ptr 的功能是让 GC 不学习指定对象。
现在让我给你看msdn的例子。
https://msdn.microsoft.com/en-us//library/1dz8byfh.aspx
// pin_ptr_1.cpp
// compile with: /clr
using namespace System;
#define SIZE 10
#pragma unmanaged
// native function that initializes an array
void native_function(int* p) {
for(int i = 0 ; i < 10 ; i++)
p[i] = i;
}
#pragma managed
public ref class A {
private:
array<int>^ arr; // CLR integer array
public:
A() {
arr = gcnew array<int>(SIZE);
}
void load() {
pin_ptr<int> p = &arr[0]; // pin pointer to first element in arr
int* np = p; // pointer to the first element in arr
native_function(np); // pass pointer to native function
}
int sum() {
int total = 0;
for (int i = 0 ; i < SIZE ; i++)
total += arr[i];
return total;
}
};
int main() {
A^ a = gcnew A;
a->load(); // initialize managed array using the native function
Console::WriteLine(a->sum());
}
听到的是问题。
没关系,传递的对象(arr)没有固定?因为非托管代码(native_function)是同步操作并在 C++/CLI 代码(加载)之前完成
即使主要逻辑正在运行,gc destory arr 是否还有机会?(我认为 A 是 main 的堆栈变量,而 arr 是 A 的成员变量,所以在运行 main 时,它应该是可见的)
如果是这样,我们如何保证 A 在调用负载之前就在那里?
(仅当不在本机代码中运行时?)
int main() {
A^ a = gcnew A;
// I Think A or arr can be destroyed in here, if it is able to be destroyed in native_function.
a->load();
...
}
提前致谢。