在clr中,我需要在调用Marshal :: StructureToPtr之前分配内存

时间:2016-03-17 07:25:54

标签: c++ clr managed-c++

我有以下代码将托管转换为非托管,反之亦然,

template<typename M, typename N> 
class MNConv
{
public:
    /// Native to Managed
    static M N2M(N* pNative){
        return safe_cast<M>(Marshal::PtrToStructure(IntPtr(pNative), M::typeid));
    };
    // Managed to Native
    static void M2N(M managed, N* pNative){
        Marshal::StructureToPtr(managed, IntPtr(pNative), true);
    };
};

我是否需要致电AllocHGlobal?如果我这样做,我应该怎么称呼它?

1 个答案:

答案 0 :(得分:0)

根据MSDN,您应该在调用StructureToPtr之前分配非托管内存块。我知道你应该在更高的范围内对本地指针执行Marshal::AllocHGlobal,你也可以在Marshal::FreeHGlobal之后执行。 仔细阅读ptr parameter description

使用AllocHGlobal也很简单 - 传递包含要分配的字节数的Int32IntPtr对象。

另请注意,您应分别在M^M中接收并返回M2NN2M的处理程序/托管引用)。