Not*_*sxl 6 c# lambda c++-cli std-function
我正在将一个托管的System.Action转换为C++/CLI项目中的非托管std :: function; 我应该在使用回调后释放给定的IntPtr,还是不必要?
void MyClass::Execute(System::Action^ callback)
{
IntPtr callbackPtr = Marshal::GetFunctionPointerForDelegate(callback);
std::function<void (void)> nativeCallback = static_cast<void (__stdcall *) (void)>(callbackPtr.ToPointer());
m_nativeObject->Execute(wrappedCallback);
// should I release callbackPtr here?
}
Run Code Online (Sandbox Code Playgroud)
没有.没有Marshal类方法可以做到这一点.与所有动态生成的代码一样,此方法创建的thunk与AppDomain关联,并在卸载AppDomain时卸载.
请注意,委托对象不是这种情况,它受普通垃圾收集规则的约束.而且你必须要小心,thunk 不能让它保持活力.这是代码中的错误,可以在本机代码忙于执行时收集委托.您需要将这行代码添加到方法的末尾:
GC::KeepAlive(callback);
Run Code Online (Sandbox Code Playgroud)
假设只有Execute()方法执行时才会进行回调.如果非托管代码将函数指针存储在此方法调用之外,则必须将委托对象存储在某处以使其保持有效.