gpt4 book ai didi

c++ - 如何关闭标准智能指针的自定义删除功能?

转载 作者:行者123 更新时间:2023-12-02 09:58:43 27 4
gpt4 key购买 nike

我介绍了一个FreeGuard类,如果初始化失败,它会清理资源:

struct Resource {...};

class FreeGuard {
public:
FreeGuard(Resource* r) : resource(r) {};
~FreeGuard() {
if (!dismissed) {
freeResource(resource);
}
}
void dismiss() { dismissed = true; }

private:
bool dismissed = false;
Resource* resource;
};

int init(Resource* r) {
FreeGuard guard(r);
if (...)
return -1;
if (...)
return -2;
...
if (...)
return -1000;
guard.dismiss();
return 0;
}

int freeResource(Resource* r) {...}
如何使用std智能指针实现相同目的,从而不必继续编写FreeGuard类?

最佳答案

您可以使用release()unique_ptr函数。当处理非RAII资源(例如C库句柄)时,这是异常安全代码的常见模式:

#include <memory>

int freeResource(Resource* r) {...}

int init(Resource* r) {
std::unique_ptr<Resource, decltype(&freeResource)> guard(r, freeResource);
if (...)
return -1;
if (...)
return -2;
...
if (...)
return -1000;
guard.release(); // releases ownership, deleter will not be called
return 0;
}
只需将 free()函数重命名为其他名称(此处为 freeResource()),以避免与标准 free()函数冲突。

关于c++ - 如何关闭标准智能指针的自定义删除功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63914784/

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