gpt4 book ai didi

c# - .NET 中 SafeBuffer 和 SafeHandleZeroOrMinusOneIsInvalid 之间的主要区别是什么?

转载 作者:行者123 更新时间:2023-12-05 04:17:55 25 4
gpt4 key购买 nike

主要区别在哪里?我知道 SafeBuffer 派生 SafeHandleZeroOrMinusOneIsInvalid 但还有什么?

我应该什么时候使用其中一种?

我需要分配和控制原生数组(在 CPU 或 GPU 上)。我的托管自定义数组应该实现 SafeBuffer 还是 SafeHandleZeroOrMinusOneIsInvalid? SafeBuffer这个名字听起来比较合理,但是为什么要实现它并且在使用之前必须调用Initialize呢?

最佳答案

Where are the major differences?

在任何地方,它们都没有共同点。 SaveBuffer 继承自 SafeHandle 以利用 SafeHandle 提供的关键终结器。这确保即使在最可怕的情况下也能释放缓冲区,例如程序中的硬崩溃通常会阻止终结器执行。

SaveBuffer 是通过操作系统调用获得的非托管内存的包装器。它只有 一个 方法仍然是抽象的,即 ReleaseHandle() 方法。由于不同的 winapi 调用有不同的方式来释放与内存关联的句柄。例如,LocalAlloc() 需要 LocalFree()。 SysAllocString() 需要 SysFreeString()。 MapViewOfFile() 需要 UnmapViewOfFile() 等。

您可以从 SaveBuffer() 派生您自己的类以利用安全句柄保证。它需要一个采用非托管指针并调用 SetHandle() 的构造函数。并且需要实现ReleaseHandle()再次释放内存。

您是否真的应该这样做是非常值得怀疑的。 ReleaseHandle() 方法由关键终结器调用。在这种方法中有很多事情你不能做,对关键终结器的要求很高,以确保终结器本身确实会导致任何会阻止其他关键终结器运行的损坏。例如,CLR 以防止异常生成的模式运行。它仅在为正常运行时间提供强有力保证的自定义 CLR 托管环境中真正重要,SQL Server 是主要示例。如果您进行操作系统调用,则可以使用它,那是坚如磐石的代码。一个 GPU 缓冲区,嗯,没那么多。您可能会领先于创建自己的包装器和自己的终结器。当发布调用失败时,您将更轻松地调试错误。

关于c# - .NET 中 SafeBuffer 和 SafeHandleZeroOrMinusOneIsInvalid 之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974194/

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