Skip to content

Defer 與自訂 Deleter ​

目標:離開 scope 時自動 fclose。

std::unique_ptr + deleter ​

cpp
std::unique_ptr<FILE, decltype(&fclose)> fp(fopen(path, "r"), &fclose);
if (!fp) { /* 開檔失敗 */ }
  • 型別是 FILE 不是 FILE*
  • unique_ptr 為空時不會呼叫 deleter,fopen 失敗也安全

自製 Defer ​

cpp
struct Defer {
    template <typename F>
    explicit Defer(F&& f) : func_(std::forward<F>(f)) {}
    ~Defer() { func_(); }

    Defer(const Defer&) = delete;
    Defer& operator=(const Defer&) = delete;

private:
    std::function<void()> func_;
};

Defer d([&] { fclose(fp); });

std::function 可以吃 lambda、std::bind、function pointer。

參考 ​

頁面歷史

Just observe 👀