C++ cli C++/CLI引脚ptr';正确使用
我是C++/CLI的新手。C++ cli C++/CLI引脚ptr';正确使用,c++-cli,pin-ptr,C++ Cli,Pin Ptr,我是C++/CLI的新手。 我已经知道pin_ptr的功能使GC无法学习指定的对象 现在让我向您展示msdn的示例。 提前谢谢 通过固定指针解决的问题不是正常的并发问题。可能没有其他线程会抢占本机函数的执行。但是,您必须在垃圾收集器中计数,垃圾收集器可能会在.NET运行时认为合适时启动。例如,系统可能内存不足,因此运行时决定收集已处置的对象。这可能发生在本机函数执行时,垃圾收集器可能会重新定位它正在使用的数组,因此您传入的指针不再有效 金科玉律是在将所有数组指针和字符串指针传递给本机函数之前锁
我已经知道pin_ptr的功能使GC无法学习指定的对象 现在让我向您展示msdn的示例。
提前谢谢 通过固定指针解决的问题不是正常的并发问题。可能没有其他线程会抢占本机函数的执行。但是,您必须在垃圾收集器中计数,垃圾收集器可能会在.NET运行时认为合适时启动。例如,系统可能内存不足,因此运行时决定收集已处置的对象。这可能发生在本机函数执行时,垃圾收集器可能会重新定位它正在使用的数组,因此您传入的指针不再有效
金科玉律是在将所有数组指针和字符串指针传递给本机函数之前锁定它们。总是。别想了,按规定去做就行了。您的代码在没有固定的情况下可以长时间正常工作,但总有一天会在最烦人的时候遭遇厄运。通过固定指针解决的问题不是正常的并发问题。可能没有其他线程会抢占本机函数的执行。但是,您必须在垃圾收集器中计数,垃圾收集器可能会在.NET运行时认为合适时启动。例如,系统可能内存不足,因此运行时决定收集已处置的对象。这可能发生在本机函数执行时,垃圾收集器可能会重新定位它正在使用的数组,因此您传入的指针不再有效
金科玉律是在将所有数组指针和字符串指针传递给本机函数之前锁定它们。总是。别想了,按规定去做就行了。您的代码在没有固定的情况下可以长时间正常工作,但总有一天会在最烦人的时候遭遇厄运。固定对象可以确保两件事:GC不会收集它,GC也不会重新定位它。如果固定一个数组元素,则可以有效地固定整个数组,因此在本例中,
arr
在运行native\u函数时固定。另外,a
无法收集,因为它在a->sum()
调用中使用,a
始终保持arr
不变。固定对象可确保两件事:GC不会收集它,GC也不会重新定位它。如果固定一个数组元素,则可以有效地固定整个数组,因此在本例中,arr
在运行native\u函数时固定。另外,a
无法收集,因为它在a->sum()调用中使用,并且a
仍然保留arr
。
// 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());
}
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();
...
}