【问题标题】:Leaking resource from a RAII object从 RAII 对象泄漏资源
【发布时间】:2015-07-18 04:32:26
【问题描述】:

我正在阅读 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 成员函数获取的悬空指针,因为只有在超出范围时才会调用删除运算符。

我错过了什么?

【问题讨论】:

  • 他是说不使用类会增加泄漏字体的机会。
  • “一些程序员可能......避免使用该类。这反过来又会增加泄漏的机会”
  • 我投票决定将此问题作为离题结束,因为 OP 误读了问题文本

标签: c++ memory-leaks


【解决方案1】:

想一想,如果您可以访问该资源,那么没有什么能阻止您对资源做任何您想做的事情。你可以复制它、销毁它、重新创建它等等。全部不使用防止资源泄漏的类。 如果您重新创建或复制它,您就可以访问非托管资源,从而增加泄漏的风险。 如果你破坏它,你可能会在你的代码中造成很大的混乱

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多