免责声明:这是 C++03。我很抱歉之前没有说清楚。由于公司的指导方针,auto_ptr 也被淘汰了。
示例代码:
void foo(boost::ptr_vector<MyType>& iPtrVector)
{
boost::scoped_ptr<MyType> aScopedPtr = new MyType();
// lots of logic here
if (condition)
iPtrVector.push_back(*aScopedPtr);
} // eek! Resource is freed, but maybe referenced in iPtrVector now!
我的问题是,当作用域指针超出作用域时,资源将被删除,但实际上,如果我的条件为真,我希望将资源保留在 ptr_vector 中。如果我决定需要将它保存在 ptr 向量中,我的方法是撤销 scoped_ptr 的所有权。但是,scoped_ptr 不允许这样做。
因此,我构建了一个简单的类来为我处理它:
template <class T>
struct CustomScopedPointer
{
CustomScopedPointer() : _targetPtr(NULL) { }
~CustomScopedPointer() { delete _targetPtr; }
T* _targetPtr;
// calling this with a null ptr will ensure the resource
// isn't deleted at dtor time
CustomScopedPointer& operator=(T* rhs)
{
_targetPtr = rhs;
return *this;
}
};
但是,有没有办法在不定义我自己的类的情况下做到这一点?对于特定的特定情况,这似乎有点矫枉过正,我很惊讶地发现没有办法阻止智能指针删除其托管资源——即使重置或重新分配首先会释放原始资源。
(至于为什么我被迫这样处理它,这是因为商业原因。可以说在发生异常等情况下必须释放资源,但同样不能在 ptr_vector 内,除非在某些情况下)