0

免责声明:这是 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 内,除非在某些情况下)

4

1 回答 1

2

使用std::unique_ptr

auto aScopedPtr = make_unique<MyType>();
// lots of logic here

if (condition)
    iPtrVector.push_back(aScopedPtr.release());

您可以搜索make_unique复制和粘贴的实现。您可以使用:

std::unique_ptr<MyType> aScopePtr{ new MyType() };

如果你真的必须,但强烈喜欢make_unique.


如果你不能使用 C++11 的特性,你可以这样做std::auto_ptr

std::auto_ptr<MyType> aScopePtr{ new MyType() };

请注意它已被弃用并且存在缺陷。

于 2013-10-04T16:28:54.617 回答