如何取消标准智能指针的自定义删除功能?

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_ptrrelease()功能。这是处理 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() 函数发生冲突。