微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我的 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 举报,一经查实,本站将立刻删除。