gpt4 book ai didi

c# - Marshal::GetFunctionPointerForDelegate:我应该发布它的结果吗?

转载 作者:太空狗 更新时间:2023-10-29 21:05:08 26 4
gpt4 key购买 nike

我正在将托管 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?
}

最佳答案

没有。没有执行此操作的 Marshal 类方法。与所有动态生成的代码一样,通过此方法创建的 thunk 与 AppDomain 相关联,并在卸载 AppDomain 时被卸载。

请注意,委托(delegate)对象不是这种情况,它受制于正常的垃圾收集规则。而且你必须要小心,这个 thunk 不会让它保持活力。这是您代码中的错误,可以在 native 代码忙于执行时收集委托(delegate)。您需要将这行代码添加到方法的末尾:

GC::KeepAlive(callback);

假设只有在执行 Execute() 方法时才会进行回调。如果非托管代码将函数指针存储在该方法调用之外,那么您必须将委托(delegate)对象存储在某处以保持其有效。

关于c# - Marshal::GetFunctionPointerForDelegate:我应该发布它的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16526263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com