从RAII对象泄漏资源
Leaking resource from a RAII object
我正在阅读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操作符只在超出作用域时才会被调用。
我错过了什么?
考虑一下,如果您可以访问资源,那么没有什么可以阻止您对资源做任何您想做的事情。你可以复制它,销毁它,重新创建它或其他什么。所有这些都不需要使用防止资源泄漏的类。如果您重新创建或复制它,则可以访问非托管资源,从而增加泄漏的风险。如果你销毁它,你可能会在你的代码中造成很大的混乱
相关文章:
- 具有瞬态资源的RAII类
- valgrind-hellgrind与泄漏检查的结果不同
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 从构造函数抛出异常时如何克服内存泄漏
- Klocwork Inside的资源泄漏
- C Winsock接受内存泄漏/资源泄漏
- 资源泄漏与否(Mac OS X)
- 资源泄漏:fExclfile
- 内核资源泄漏BIO_do_connect
- 如何更正GDI资源泄漏
- 数组中的资源泄漏
- 删除运算符导致资源泄漏
- 多态性=资源泄漏中基类缺少虚拟析构函数
- 下面的代码会导致资源泄漏吗?
- 使用std::uninitialized_copy的Stroustrup示例中的资源泄漏
- 资源泄漏opengl/win32
- MFC SendMessage()中的资源泄漏
- 从RAII对象泄漏资源
- 了解c++中内存泄漏的良好资源/书籍
- 我的程序泄漏了boost::shared_ptr拥有的资源