调用未跟踪代码时如何处理异常安全

问题描述

我的 C# 应用程序从用 C++ 编写的 .dll 调用函数。 例如,考虑以下代码片段:

path('graphql/',GraphQLView.as_view(graphiql=False))

你可以猜到 RLibPINVOKE.new_Request() 函数在 C++ 端动态创建 Request 对象(new Request())。因此,为了删除该对象,我调用了另一个函数RLibPINVOKE.delete_Request(requestRef);。显然,这不是异常安全的代码,因此我们很容易发生内存泄漏。我需要在 C# 中使用 RAII,但我搜索并发现 C# 中没有这样的技术,因为该语言具有垃圾收集器(至少这是我的理解)。我还注意到可以通过 using 指令实现 RAII,例如:

IntPtr request = RLibPINVOKE.new_Request();
HandleRef requestRef = new HandleRef(null,request);
IntPtr requestCreateKey = RLibPINVOKE.Request_CreateKey(requestRef,"some_URL","some_Token");
HandleRef requestCreateKeyRef = new HandleRef(null,requestCreateKey);
RLibPINVOKE.delete_Request(requestRef);

但似乎我不能在我的情况下应用这种技术。那么如何正确解决我的问题?

using(RAIIObject obj = new RAIIObject())
{
   // do some stuff
}

在上述解决方案中,我还必须具有 GetRef() 函数,因为我需要获取 requestRef 对象以供进一步使用。另外,因为我还有其他 new 函数(还有它们的 delete 对应函数),例如 RLibPINVOKE.new_decrypt()、RLibPINVOKE.delete_decrypt() 等,有我要实现多少个 Wrapper 类?总的来说,这是合理的方式吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)