#include <memory>
struct B;
struct A
{
std::shared_ptr<B> field1_;
A():field1_ (std::make_shared<B>()){}
};
template<class A>
struct B: std::enable_shared_from_this<B<A>>
{
A *field1_;
void stop()
{
delete field1_; //~= delete this
}
A* start()
{
field1_ = new A(shared_from_this());
return field1_;
}
};
int main()
{
A * reftoA = nullptr;
{
std::shared_ptr<B<A>> b = std::make_shared<B<A>>();
reftoA = b->start();
}
reftoAa->field1_->stop();
}
我有一个生产中的错误,我想知道上面的代码是否会破坏HEAP或导致未定义的行为。
编辑: 我已经将上面的代码更改为更接近我的真实代码。
答案 0 :(得分:2)
由于
,该代码甚至不应该编译void setA(A* a):field1_(a){}
无效。
此外,由于您已经在使用智能指针,为什么要将A *field1_;
保留在B
?
答案 1 :(得分:2)
在故意和谨慎地完成时,从其自己的方法中删除对象是一种非常常见的技术。许多较旧的参考计数设计以这种方式工作,例如COM和Mozilla代码库之类的衍生产品。请参阅:http://www.parashift.com/c++-faq-lite/delete-this.html获取建议。
但在这种情况下,它看起来像是一种偶然的混叠。结构B
似乎部分地像field1_
中对象的“所有者”一样行动,从而赋予它删除它的权利,然后你就可以在其上扮演一个邪恶的伎俩。
这就是C ++,如果没有看到完整程序的来源,实际上不可能判断这是否会导致未定义的行为。
答案 2 :(得分:0)
像这样的生产代码应该有死刑。
您致电B::func
,它会销毁指向的A
,然后在main
中再次删除A
。你有什么期望?