我正在为ESP8266开发一个小类,我需要能够在同一个对象的另一个实例中保存对象的引用。运行代码时,我一直在获取例外。经过一些调试后,它看起来像是在对象仍在范围内时调用类析构函数。我很长一段时间没有使用过C ++,但这种行为似乎不对。
实际上有两个问题。
我已将代码缩减为显示问题的小程序。在下面的代码中,类的析构函数在' 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
答案 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);但即便如此,子指针也无法延长对象的生命周期。