我有一个从构建器创建的对象。 做了一些事后我必须删除它。 但是,如果抛出异常,则无法访问代码
{
cClass* cc = MyBuilder.build();
// do something usefull, exception may be thrown
delete cc;
}
由于C ++中没有像Java中那样的finally关键字,因此资源获取是初始化是可行的方法。正确?
那么,如何使用资源获取初始化来实现Builder模式?
答案 0 :(得分:3)
MyBuilder
应返回unique_ptr
或shared_ptr
,具体取决于是否要保留对返回指针本身的引用。这不仅可以提供所需的异常安全性,而且如果由于某种原因构建器必须销毁它后来创建的对象,它也会有所帮助:
class MyBuilder {
std::shared_ptr<MyClass> build() {
return std::shared_ptr<MyClass>{new MyClass(), [this](MyClass* ptr){ destroy(ptr); } };
}
void destroy(MyClass* ptr) {
/* do something with ptr */
delete ptr;
}
};
//later:
{
auto ptr = myBuilder.build();
} //automatically calls myBuilder.destroy(ptr)