gpt4 book ai didi

c++ - boost:scoped_ptr 到 boost::ptr_vector 而不释放资源

转载 作者:行者123 更新时间:2023-11-28 03:08:06 25 4
gpt4 key购买 nike

免责声明:这是 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 if 我的条件为真。如果我决定需要将它保存在 ptr vector 中,我的方法是从 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 内)

最佳答案

使用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() };

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

关于c++ - boost:scoped_ptr 到 boost::ptr_vector 而不释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19186140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com