boost:scoped_ptr to boost :: ptr_vector而不释放资源

时间:2013-10-04 16:21:01

标签: c++ boost c++03

免责声明:这是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之外)

1 个答案:

答案 0 :(得分: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() };

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

相关问题