从RAII对象泄漏资源

时间:2015-07-18 04:32:27

标签: c++ memory-leaks

我正在阅读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运算符。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

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