gpt4 book ai didi

c# - 如何防止同一个非托管指针被封装在两个不同的 SafeHandles 中?

转载 作者:行者123 更新时间:2023-11-30 18:11:20 27 4
gpt4 key购买 nike

我正在为用 C 编写的游戏引擎编写一个托管包装器来挑战自己。我已经开始将非托管指针包装在 SafeHandle 派生类中,但对我来说,调用可以返回相同指针的非托管函数可能会创建新的 SafeHandles,如果其中一个被处置,则其余的将失效。

如何有效防止这种情况发生?我怀疑编码器会自动跟踪重复项...

最佳答案

您正在尝试解决大多数托管指针和非垃圾收集技术试图解决的问题。根据用例,有多种解决方案 -

  1. 您可以使用引用计数 - 您基本上可以维护持有特定指针的句柄数量的计数和重载(在 C 中使用函数调用而不是赋值)运算符来更新赋值计数。然后,仅在计数达到 0 后才释放指针。这种方法虽然准确,但开销很大,而且容易受到循环影响,因此可能会泄漏内存。这是一个引用计数所有权模型。

  2. 您可以创建一个unique_ptr。这基本上意味着在任何时候只有 1 个句柄保存对特定指针的引用。这意味着如果你做类似的事情 -

    a = b 

    指针将从b复制到a,并且b将自动失效(更多的是API的契约,而不是执行)。这意味着用户必须围绕这些约束构建代码。当持有引用的任何对象超出范围时,就会完成释放。这是一种排他性所有权模式。

还有其他方法(例如 weak_ptr),您可以在任何 C++ 引用中阅读它们。

关于c# - 如何防止同一个非托管指针被封装在两个不同的 SafeHandles 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392599/

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