从RAII对象泄漏资源

Leaking resource from a RAII object

本文关键字:资源 泄漏 对象 RAII      更新时间:2023-10-16

我正在阅读Scott Meyers的《Effective c++》,现在我读到Item 15,在资源管理类中提供对原始资源的访问。下面是一个例子:

class Font { // RAII class
public:
    explicit Font(FontHandle fh) // acquire resource;
        : f(fh) // use pass-by-value, because the
    {} // C API does
    ~Font() { releaseFont(f ); } // release resource
    ... // handle copying (see Item14)
private:
    FontHandle f; // the raw font resource
};

他建议引入一个显式的转换成员函数来访问原始资源:

class Font {
public:
    ...
    FontHandle get() const { return f; } // explicit conversion function
    ...
};

他说:

一些程序员可能会发现需要显式地请求这样的转换令人不快,因此避免使用该类。,在反过来,会增加字体泄漏的机会,而这正是字体泄漏的原因字体类的设计是为了防止。

我不明白提供对原始资源的访问如何增加泄漏字体的机会?我们只是返回了指向资源对象的原始指针的副本。而且我们不需要担心访问通过get成员函数获得的悬空指针,因为delete操作符只在超出作用域时才会被调用。

我错过了什么?

考虑一下,如果您可以访问资源,那么没有什么可以阻止您对资源做任何您想做的事情。你可以复制它,销毁它,重新创建它或其他什么。所有这些都不需要使用防止资源泄漏的类。如果您重新创建或复制它,则可以访问非托管资源,从而增加泄漏的风险。如果你销毁它,你可能会在你的代码中造成很大的混乱