如何防止同一个非托管指针被封装在两个不同的 SafeHandle 中?
How can I prevent the same unmanaged pointer from being encapsulated in two different SafeHandles?
我正在为用 C 语言编写的游戏引擎编写一个托管包装器来挑战自己。我已经开始将非托管指针包装在 SafeHandle
衍生物中,但它让我明白,调用可能 return 相同指针的非托管函数可能会创建新的 SafeHandles,如果其中一个被处置,其余的将失效。
我怎样才能有效地防止这种情况发生?我怀疑编组器会自动跟踪重复项...
您正在尝试解决大多数托管指针和非垃圾收集技术试图解决的问题。根据用例,有多种解决方案 -
您可以使用引用计数 - 您基本上维护持有特定指针的句柄数量的计数和重载(在 C 中使用函数调用而不是赋值)运算符来更新赋值计数。然后,仅在计数达到 0
后才释放指针。这种方法虽然准确,但开销很大,而且容易受到循环的影响,因此可能会泄漏内存。这是一个引用计数所有权模型。
您可以创建一个unique_ptr
。这基本上意味着在任何时候只有 1 个句柄持有对特定指针的引用。这意味着如果你做类似的事情 -
a = b
指针将从b
复制到a
并且b
将自动失效(更多的是API的契约,而不是执行)。这意味着用户必须围绕这些约束构建代码。当持有引用的任何对象超出范围时,释放就完成了。这是一种排他性的所有权模式。
还有其他方法(如 weak_ptr
),您可以在任何 C++ 参考资料中阅读它们。
虽然这个答案是another question,但在这种情况下它会起作用。
我可以创建一个工厂 class 来为我调用托管函数,然后在 Constrained Execution Region 中手动创建 SafeHandles,就像 marhsaller 所做的那样。这个工厂 class 可以跟踪非托管指针,如果已经创建了一个 SafeHandle,return 它而不是创建一个新的。
我正在为用 C 语言编写的游戏引擎编写一个托管包装器来挑战自己。我已经开始将非托管指针包装在 SafeHandle
衍生物中,但它让我明白,调用可能 return 相同指针的非托管函数可能会创建新的 SafeHandles,如果其中一个被处置,其余的将失效。
我怎样才能有效地防止这种情况发生?我怀疑编组器会自动跟踪重复项...
您正在尝试解决大多数托管指针和非垃圾收集技术试图解决的问题。根据用例,有多种解决方案 -
您可以使用引用计数 - 您基本上维护持有特定指针的句柄数量的计数和重载(在 C 中使用函数调用而不是赋值)运算符来更新赋值计数。然后,仅在计数达到
0
后才释放指针。这种方法虽然准确,但开销很大,而且容易受到循环的影响,因此可能会泄漏内存。这是一个引用计数所有权模型。您可以创建一个
unique_ptr
。这基本上意味着在任何时候只有 1 个句柄持有对特定指针的引用。这意味着如果你做类似的事情 -a = b
指针将从
b
复制到a
并且b
将自动失效(更多的是API的契约,而不是执行)。这意味着用户必须围绕这些约束构建代码。当持有引用的任何对象超出范围时,释放就完成了。这是一种排他性的所有权模式。
还有其他方法(如 weak_ptr
),您可以在任何 C++ 参考资料中阅读它们。
虽然这个答案是another question,但在这种情况下它会起作用。
我可以创建一个工厂 class 来为我调用托管函数,然后在 Constrained Execution Region 中手动创建 SafeHandles,就像 marhsaller 所做的那样。这个工厂 class 可以跟踪非托管指针,如果已经创建了一个 SafeHandle,return 它而不是创建一个新的。