因此,据我了解,它可以正确实现RAII,如果我在哪里调用CreateFont,我会将其包装在一个类中,该类在构造函数中包含CreateFont,在析构函数中包含DeleteObject,以便在超出范围时对其进行清理。

第一个问题是,我是否最终会遇到很多这样的类(class)?特别是因为该类只有一个构造函数和析构函数。

第二个问题是,如果我在WndProc中调用CreateFont类,那会不断超出范围。所以我应该在WndMain中对CreateFontLoadBitmap进行所有调用吗?
我习惯于在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是正确计数的引用,因此,如果您想在某个地方创建它并“提升”它的生命周期,可以通过在它死之前将其复制到一个生命周期更长的地方来实现。

10-08 01:14