删除此体系结构和未定义的行为

时间:2012-11-05 09:52:10

标签: c++ shared-ptr delete-operator

#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或导致未定义的行为。

编辑: 我已经将上面的代码更改为更接近我的真实代码。

3 个答案:

答案 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。你有什么期望?