在C++/CLI中传递非托管指针,可以使用pin_ptr
关键字来确保指针在托管代码中保持固定,以避免被垃圾回收机制移动。以下是一个简单的示例:
#include<iostream>
#include <vcclr.h>
using namespace System;
using namespace System::Runtime::InteropServices;
int main() {
// 创建一个非托管的字符串
char* nativeString = new char[100];
strcpy(nativeString, "Hello from native code!");
// 使用pin_ptr固定非托管指针
pin_ptr<char> pinnedNativeString = &nativeString[0];
// 在托管代码中使用非托管指针
String^ managedString = Marshal::PtrToStringAnsi(IntPtr(pinnedNativeString));
// 输出结果
Console::WriteLine("Native string: {0}", managedString);
// 释放非托管内存
delete[] nativeString;
return 0;
}
在这个示例中,我们首先创建了一个非托管的字符串,然后使用pin_ptr
关键字将其固定,以便在托管代码中使用。接下来,我们使用Marshal::PtrToStringAnsi
方法将非托管指针转换为托管字符串。最后,我们释放非托管内存并返回结果。
需要注意的是,在使用pin_ptr
时,必须确保在使用完毕后解除固定,以避免内存泄漏。此外,在使用非托管资源时,应确保在托管代码中正确地释放它们,以避免内存泄漏和资源泄漏。
领取专属 10元无门槛券
手把手带您无忧上云