C++ auto_ptr是否可以防止这种情况?
我不太清楚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成员;
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);
}