我有一个非托管类,它接受指向内存的指针作为其存储空间。
例如
class MemBlock
{
void* mpMemoryBlock;
// Various other variables that manipulate the memory block goes here.
public:
MemBlock( void* pMemoryBlock ) :
mpMemoryBlock( pMemoryBlock )
{
}
// A load of code that does operation on the memory block goes here.
};
现在我正在尝试包装这个类以便在 C# 中使用。显然,我希望能够将类似 a 的东西传递float[]
给班级。显而易见的事情是cli::pin_ptr
从包装类中使用。
public ref class MemBlockWrapper
{
MemBlock* mpMemBlock;
public:
MemBlockWrapper( array< float >^ fltArray )
{
cli::pin_ptr< float > pFltArray = &fltArray[0];
// Brilliant we can now pass this pinned array to the C++ code.
mpMemBlock = new MemBlock( (void*)pFltArray );
// Now the pin_ptr goes out of scope ...
}
}
但是,固定 ptr 仅在 cli::pin_ptr 在范围内时才有效。构造函数退出的那一刻,我不能再保证 C++ 类拥有的内存块是真实的。
有没有办法在类的生命周期内固定一个指针?我做了很多搜索,只找到了一种使用“GCHandle”的方法,该方法似乎纯粹用于托管 C++(即不是 C++/CLI)。有人可以指出我确定性地固定和取消固定指针的方法吗?