提问人:Mohit 提问时间:7/5/2023 最后编辑:Mohit 更新时间:7/6/2023 访问量:149
RAII 使用自定义删除程序的 unique_ptr
RAII using custom deleter of unique_ptr
问:
我想使用 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
答:
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
时将其地址作为“范围退出对象”。这是最可靠的选项。
评论
SOMETHING
deleter
std::unique_ptr
ScopeGuard
std::shared_ptr<void> scopeGuard
void*
unique_ptr<void, decltype(deleter)>
&deleter
&upp