【发布时间】:2015-01-28 13:55:41
【问题描述】:
在这段代码中,Apple 和 Fruit 的析构函数根本不会被调用。我在两者中都有std::cerr 语句,并且Apple 中有一些清理代码无法运行。我认为调用删除就足够了?我正确地做 RAII 吗?我还用 std::unique_ptr 替换了原始指针,结果相同。
int32_t Fruit::frutificate(const Settings& settings) {
Fruit *listener;
if (settings.has_domain_socket()) {
listener = new Apple(settings);
} else {
listener = new Orange(settings);
}
int r = uv_run(listener->loop, UV_RUN_DEFAULT);
delete listener;
return r;
}
更新: 所有类都有虚拟析构函数。
【问题讨论】:
-
Fruit有虚拟析构函数吗?否则你有未定义的行为(可能表现为未能调用正确的析构函数)。 -
@Deduplicator:甚至没有指针:
int32_t Fruit::frutificate(const Settings& settings) { if (settings.has_domain_socket()) { return uv_run(Apple(settings).loop, UV_RUN_DEFAULT); } else { return uv_run(Orange(settings).loop, UV_RUN_DEFAULT); } } -
所有课程是否包括
Fruit...我知道愚蠢的问题,请耐心等待 -
没有完整的类定义,真的不可能说出任何事情。
-
这个问题离题外话只差一票,请添加必要的信息让我们回答,这意味着至少
Fruit的析构函数声明,最好是MCVE