我介绍了一个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/