对变量范围感到困惑 - 意外调用析构函数
Confused by variable scope - destructor called unexpectedly
我有 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 的子项,并且 Fruit 被声明在条件之外,所以范围不应该持续到 return?
您正在创建 Apple
类型的临时文件。它在它所属的表达式的末尾超出范围 - 这是赋值语句。当它超出范围时,将调用析构函数。 Fruit
和Apple
之间的层级关系在这里是无关紧要的。
如果有帮助,你可以想到这个块:
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,这使其成为反模式。
我有 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 的子项,并且 Fruit 被声明在条件之外,所以范围不应该持续到 return?
您正在创建 Apple
类型的临时文件。它在它所属的表达式的末尾超出范围 - 这是赋值语句。当它超出范围时,将调用析构函数。 Fruit
和Apple
之间的层级关系在这里是无关紧要的。
如果有帮助,你可以想到这个块:
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,这使其成为反模式。