因此,据我了解,它可以正确实现RAII,如果我在哪里调用CreateFont
,我会将其包装在一个类中,该类在构造函数中包含CreateFont
,在析构函数中包含DeleteObject
,以便在超出范围时对其进行清理。
第一个问题是,我是否最终会遇到很多这样的类(class)?特别是因为该类只有一个构造函数和析构函数。
第二个问题是,如果我在WndProc中调用CreateFont类,那会不断超出范围。所以我应该在WndMain中对CreateFont
或LoadBitmap
进行所有调用吗?
我习惯于在WM_CREATE
中调用这些函数,并在WM_DESTROY
中对其进行清理。
最佳答案
通过使用模板可以帮助您避免很多重复的工作。例如,如果您使用boost::shared_ptr
,则可以执行以下操作:
#include <boost/shared_ptr.hpp>
#include <functional>
struct Font;
Font *createFont();
void deleteFont(Font*);
int main() {
boost::shared_ptr<Font> font(createFont(), std::ptr_fun(deleteFont));
}
这省去了编写自定义类来管理资源的麻烦。如果您无法使用boost和TR1或更高版本,则仍然可以自己实现类似和通用的功能来提供帮助。
boost::shared_ptr
是正确计数的引用,因此,如果您想在某个地方创建它并“提升”它的生命周期,可以通过在它死之前将其复制到一个生命周期更长的地方来实现。