所以正如我所理解的那样,正确地实现RAII,如果我在哪里调用CreateFont,我将它包装在一个类中,在构造函数中的CreateFont和析构函数中的DeleteObject,所以当它超出范围时,它会被清除.
第一个问题是,不会结束ALOT的类吗?特别是由于类只有一个构造函数和析构函数.
第二个问题是,如果我在WndProc中调用CreateFont类,那么它将不断地超出范围.所以我应该做所有的调用CreateFont或在WndMain中的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是引用计数正确的,所以如果你想在某个地方创建它,并且“促销”它可以在更长的时间内生活,你可以通过将它复制到死亡之前的较长时间内来实现.