C++ auto_ptr是否可以防止这种情况?

C++ auto_ptr是否可以防止这种情况?,c++,auto-ptr,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; } A类 { A(施工人员B和成员) :_成员(B) {}; ... 康斯特B&U成员;

我不太清楚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;
}
A类
{
A(施工人员B和成员)
:_成员(B)
{};
...
康斯特B&U成员;
};
代词A(){
自动ptr智能(新B());
A myA(*smart);
返回myA;
}
smart
离开其封闭范围时,
myA.\u成员
引用是否有效?如果auto_ptr不是这里的答案,那么答案是什么


编辑:我知道我把每个人都弄糊涂了;我必须在范围外返回myA,这就是为什么我关心smart退出范围后_成员是否有效

这对你没有帮助_成员将成为一个悬垂的手柄。这是因为
auto_ptr
保证范围结束时销毁:不多也不少

有两种可能的答案

  • 您可以创建_成员的类型
    boost::shared_ptr
  • 或者,如果类B是小的可复制的单态的,并且对象标识不需要保留,则可以将_成员设为值,并将参数的副本存储在那里。这是迄今为止最简单的选择,但显然是相当有限的

回应您的编辑:这确实是我所说的情况。通过按值返回myA,将创建一个副本,副本的_成员将引用已销毁的本地。如前所述,
shared_ptr
和值语义都解决了这个问题。
auto_ptr
类是普通指针的包装器。当堆栈展开时,它们负责取消分配(调用
auto_ptr
的析构函数,从而释放包含的对象)

请注意,您的
对象也是在堆栈上创建的。当作用域结束时,A和auto_ptr都将被释放。超过这一点,尝试访问
对象将导致编译时错误

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


还请注意,对于C++0x,
auto_ptr
已被弃用。改用
唯一\u ptr
。请务必查看C++0x中即将出现的类型。

无需将原始类型也共享\u ptr。shared_ptr有一个构造函数,它接受std::auto_ptr并从中获取所有权。很酷,我不知道:)不过,为了清晰起见,我还是将两者都制作成shared_ptr。(从我的帖子中删除了注释)注意,在给出的示例中,不会有悬空句柄,因为智能指针和它复制到的类都具有相同的作用域。但这是一个糟糕的例子,如果不是信的话,你可能抓住了问题的核心。是的,我甚至没有注意到myA是本地人,但我很确定他不是那个意思。
{
   auto_ptr<B> smart(new B());
   A myA(*smart);
}
{
    B  myB;
    A  myA(myB);
}