auto_ptr会防止这种情况吗?

时间:2009-03-09 17:42:38

标签: c++ auto-ptr

我不太清楚auto_ptr在这种情况下是否会帮助我:

class A
{
  A(const B& member)
   : _member(B)
  {};

...
  const B& _member;
};


A generateA() {
   auto_ptr<B> smart(new B());
   A myA(*smart);
   return myA;
}

myA._member离开其封闭范围时,smart引用是否有效?如果auto_ptr不是这里的答案,那是什么?

编辑:我看到我困惑每个人的地方;我必须将myA返回到范围之外,这就是为什么我关心_member在智能退出范围后有效。

3 个答案:

答案 0 :(得分:6)

它对你没有帮助。 _member将成为一个悬空的手柄。这是因为auto_ptr保证在范围结束时销毁:不再存在,不小于

有两种可能的答案。

  • 您可以输入_member的类型boost::shared_ptr<const B>
  • 或者,如果B类可复制单态,则不需要保留对象标识 < / strong>,你可以使_member成为一个值,并在那里存储一个参数的副本。这是迄今为止最简单的选择,但显然它是非常有限的。

回复您的修改:确实就是我所说的情况。通过按值返回myA,创建一个副本,副本的_member引用已经被破坏的本地。如上所述,shared_ptr和值语义都解决了这个问题。

答案 1 :(得分:2)

auto_ptr类是普通指针的包装器。当堆栈被展开时,它们负责解除分配(auto_ptr的析构函数被调用,这反过来释放了包含的对象)。

请注意,您的A对象也是在堆栈上创建的。当范围结束时,A和auto_ptr都将被释放。除此之外,尝试访问A对象会给您一个编译时错误。

假设A对象是在块外的某个地方创建的,那么你就有了一个真正的问题。由于A对象将引用存储到块范围之外的B对象,因此该引用变为无效。

另请注意,对于C ++ 0x,不推荐使用auto_ptr。请改用unique_ptr。请查看C ++ 0x中的General Purpose Smart Pointers

答案 2 :(得分:0)

{
   auto_ptr<B> smart(new B());
   A myA(*smart);
}

指向“smart”的指针和对象“myA”都将在此范围的末尾被销毁。但这应该是你想要的代码片段。

一旦范围结束,'myA'将首先销毁(最后宣布) 然后跟随此智能将被销毁,其析构函数将删除指针。

由于无法引用'smart'或'myA',我希望你能在此时删除poiner。

或者你可以这样做:

{
    B  myB;
    A  myA(myB);
}