免责声明:这是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之外)
答案 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() };
请注意,它已被弃用且存在缺陷。