RAII 使用自定义删除程序的 unique_ptr

RAII using custom deleter of unique_ptr

提问人:Mohit 提问时间:7/5/2023 最后编辑:Mohit 更新时间:7/6/2023 访问量:149

问:

我想使用 std::unique_ptr 进行自动清理,但要初始化unique_ptr我需要一个地址指向。如何避免 noUse 变量?

bool noUse;
auto deleter = [](bool *){ DESTROY_SOMETHING }; 
std::unique_ptr<bool, decltype(deleter)> upp(&noUse, deleter); // I want to avoid the usage of this extra noUse variable
START_SOMETHING

//COMPLEX IF ELSE RETURN LOGIC

**更新:** 我最终求助于此代码。感谢大家的快速回复。

auto deleter = [](void *){ DESTROY_SOMETHING };
std::unique_ptr<void, decltype(deleter)> upp(nullptr, deleter);

if(enabled)
{
   //START_SOMETHING
   upp.reset(reinterpret_cast<void *>&upp);
}

//COMPLEX IF ELSE RETURN LOGIC

C++ C++11 RAII

评论

0赞 463035818_is_not_an_ai 7/5/2023
什么?如何删除某些内容?SOMETHINGdeleter
3赞 Jan Schultke 7/5/2023
这回答了你的问题吗?在函数作用域末尾执行代码的简单方法
3赞 Evg 7/5/2023
不要滥用.std::unique_ptr
0赞 pptaszni 7/5/2023
有一次我为某个项目写了自己的文章,然后决定不值得付出努力。现在我只用于这种场景。我认为变量的名称使意图清晰。演示ScopeGuardstd::shared_ptr<void> scopeGuard
1赞 Brian Bi 7/6/2023
如果让删除程序 take (并使用 ),则可以将自身作为指针值传递,甚至 .void*unique_ptr<void, decltype(deleter)>&deleter&upp

答:

0赞 Jan Schultke 7/5/2023 #1

只要自定义删除器不需要任何特定值,就可以使用一些任意整数文字(零除外,这将使它成为空指针):noUse

auto deleter = [](bool *){ DESTROY_SOMETHING };

// slightly longer but more robust:          reinterpret_cast<bool*>(&upp)
std::unique_ptr<bool, decltype(deleter)> upp(reinterpret_cast<bool*>(1), deleter);
// ...

这有点黑客攻击,并且有更好的解决方案,例如 std::experimental::scope_exit。这也没有多大意义,如果我们不关心类型,为什么不直接使用 a?bool*void*

还可以构建自己的解决方案,请参阅:

@Joe编写了一个与此非常相似的解决方案std::experimental::scope_exit


注 1:将 1 转换为 bool* 具有实现定义的效果 ([expr.reinterpret_cast]),使用此指针是实现定义的 ([basic.stc.general]),指向 nullptr 的指针的比较是实现定义的,但从不使用 UB ([expr.eq])。

注 2:开发人员通常会创建一个局部静态变量,并在需要 std::unique_ptr 时将其地址作为“范围退出对象”。这是最可靠的选项。