当对象仍在范围内时,Arduino类析构函数被调用

时间:2017-12-26 23:15:16

标签: c++ arduino destructor esp8266

我正在为ESP8266开发一个小类,我需要能够在同一个对象的另一个实例中保存对象的引用。运行代码时,我一直在获取例外。经过一些调试后,它看起来像是在对象仍在范围内时调用类析构函数。我很长一段时间没有使用过C ++,但这种行为似乎不对。

实际上有两个问题。

  1. 为什么在对象仍在范围内时调用析构函数?
  2. 是否可以在没有调用析构函数的情况下保持对象超出对象范围的引用(如在链表中)?
  3. 我已将代码缩减为显示问题的小程序。在下面的代码中,类的析构函数在' child'上被调用。虽然对象仍然在范围内。我在代码中指出它实际上被调用了两次。

    这里是代码的输出:

            Starting
            adding child to root
            Out of scope name=child
            adding child to root2
            Out of scope name=child
            Done, both root and child should still be in scope
    
    index

2 个答案:

答案 0 :(得分:3)

TestObject::setChild通过 value 获取其参数,以便创建TestObject的副本,由函数使用,然后销毁。这是你所看到的析构函数的来源。 setChild还会获取指向此本地副本的指针,以便child中的TestObject指针指向已被销毁的对象。

解决方案是通过 reference 传递参数:

void TestObject::setChild(TestObject &h)

答案 1 :(得分:0)

在void setChild(TestObject h)中;您将成员的子指针设置为临时(参数)的地址。您可能想要传递引用void setChild(TestObject& h);但即便如此,子指针也无法延长对象的生命周期。