我不太清楚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不是这里的答案,那是什么?
答案 0 :(得分:6)
它对你没有帮助。 _member将成为一个悬空的手柄。这是因为auto_ptr
保证在范围结束时销毁:不再存在,不小于。
有两种可能的答案。
boost::shared_ptr<const B>
。 回复您的修改:确实就是我所说的情况。通过按值返回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);
}