gpt4 book ai didi

c++ - 使非对象资源符合 RAII

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:14:37 25 4
gpt4 key购买 nike

在我的代码中我使用 HANDLE来自 windows.h .它们的用法如下

HANDLE h;
if (!openHandleToSomething(arg1, arg2, &h)) {
throw std::exception("openHandleToSomething error");
}
/* Use the handle in other functions which can throw as well */
if (!CloseHandle(h)) {
throw std::exception("closeHandle error");
}

如您所见,您必须插入这个 CloseHandle对于在获取和释放过程中可能发生的每个异常。因此,您很可能忘记了一个(或者有一个您不知道的奇特的 SEH 异常)并且瞧瞧,您有内存泄漏。

最近,我读到了有关 RAII 的文章,它应该可以消除这种情况下的麻烦,并且应该称之为 CloseHandle自动地。我还看到有类似 std::auto_ptr<someType> 的东西在 C++ 中解决了用 new 分配的资源的问题.

但是,由于我不使用 newHANDLE只是typedef编辑为 void * , 我想知道我应该如何使用 std::auto_ptr<someType> .不知何故,应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); })。创建一个类将是另一种方法,因为只要它的实例超出范围,就会调用析构函数。但是,为每件简单的事情都上课就太过分了。

如何修复这些意外的内存泄漏?

请注意,我更喜欢纯 C++ 的解决方案,没有库和大的依赖项,除非它们非常小并且无论如何都在大多数环境中使用。

最佳答案

想到的一个想法是使用 boost::shared_ptrcustom deleter .

关于c++ - 使非对象资源符合 RAII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1556168/

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