我有 3 个类,Fruit、Apple 和 Orange,Fruit 是两者的父级。我有一个静态方法,我在其中执行以下操作:
int32_t Fruit::frutificate(const Settings& settings) {
Fruit listener;
if (settings.has_domain_socket()) {
listener = Apple(settings);
} else {
listener = Orange(settings);
}
return uv_run(listener.loop, UV_RUN_DEFAULT);
}
让我感到困惑的是,Apple 的析构函数在条件内被调用,它运行 Fruit 没有的清理代码。 Apple 是 Fruit 的 child ,而 Fruit 被声明在条件之外,所以范围不应该一直持续到返回吗?
最佳答案
您正在创建 Apple
类型的临时文件。它在它所属的表达式的末尾超出范围 - 这是赋值语句。当它超出范围时,将调用析构函数。 Fruit
和 Apple
之间的层级关系在这里无关紧要。
如果有帮助,你可以想到这个 block :
if (settings.has_domain_socket()) {
listener = Apple(settings);
}
基本上等同于:
if (settings.has_domain_socket()) {
Apple some_temporary_apple(settings);
listener = std::move(some_temporary_apple);
}
这可能更清楚为什么 ~Apple()
在赋值结束时被调用。
另请注意:
Fruit f = Apple();
将执行 object slicing ,这使它成为一种反模式。
关于c++ - 对变量范围感到困惑 - 意外调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28192501/