2011-03-11 50 views
0

我的代码需要范围守卫,但是我必须手动Dismiss()所有范围守卫通常退出功能?即ScopeGuard解雇

void Deleter(MyClass* obj) 
{ 
    delete obj; 
} 

MyClass* Func() 
{ 
    MyClass* obj = new MyClass(); 
    ScopeGuard sg1 = MakeObjGuard(Deleter, obj); 

    //More objects created. And more scope guards. 

    sg1.Dismiss(); 
    //...Same for other guards 
    return obj; 
} 
+1

ScopeGuard和MakeObjGuard的定义是什么? – 2011-03-11 06:02:34

+1

http://drdobbs.com/184403758 – nakiya 2011-03-11 06:05:32

+1

你最好只用'std :: auto_ptr obj(new MyClass); ... return obj.release();' – MSalters 2011-03-11 10:25:40

回答

0

鉴于ScopeGuard的this implementation,那么答案是肯定的。删除对象将在ScopeGuard的析构函数中发生,除非您通过调用Dismiss方法来禁用它。

+0

但是,如果返回指向其中一个对象的指针,则应该最好不要删除该**对象。虽然对其他人也许可以。 – 2011-03-11 06:14:26

1

你必须解除你想保留的对象的警卫后功能。否则,他们会删除他们正在守卫的对象。