如何取消标准智能指针的自定义删除功能?
How can I dismiss a custom delete function of a std smart pointer?
我介绍了一个 FreeGuard class,它可以在初始化失败时清理资源:
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 classes?
可以使用unique_ptr
的release()
功能。这是处理 non-RAII 资源(如 C 库句柄)时 exception-safe 代码的常见模式:
#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()
函数发生冲突。
我介绍了一个 FreeGuard class,它可以在初始化失败时清理资源:
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 classes?
可以使用unique_ptr
的release()
功能。这是处理 non-RAII 资源(如 C 库句柄)时 exception-safe 代码的常见模式:
#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()
函数发生冲突。