我正在阅读Scott的有效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操作符。
我错过了什么?
发布于 2015-07-18 11:52:18
想想看,如果您可以访问资源你可以复制它,摧毁它,重建它或者其他什么。所有这些都没有使用防止资源泄漏的类。如果您重新创建它,或者复制它,您就可以访问非托管资源,从而增加泄漏的风险。如果你销毁它,你可能会在你的代码中造成很大的混乱。
https://stackoverflow.com/questions/31487809
复制相似问题