我正在阅读Scott Meyers的Effective C ++,现在我在第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运算符。
我错过了什么?
答案 0 :(得分:1)
考虑一下,如果你可以访问资源,没有什么能阻止你做任何你想要的资源。您可以复制,销毁,重新创建或其他任何东西。所有这些都没有使用防止资源泄漏的类。 如果重新创建或复制它,则可以访问非托管资源,从而增加泄漏风险。 如果你销毁它,你可能会在你的代码中造成一大堆混乱