【发布时间】:2019-07-27 14:16:36
【问题描述】:
struct Base {
Base() {
std::cout << "Inside: " << __PRETTY_FUNCTION__ << std::endl;
}
~Base() {
std::cout << "Inside: " << __PRETTY_FUNCTION__ << std::endl;
}
};
struct BaseWrapper {
const Base &b;
};
int main()
{
{
auto *w = new BaseWrapper{{}};
std::cout << "Inside: " << __PRETTY_FUNCTION__ << std::endl;
delete w;
}
return 0;
}
当我用 C++11 或 C++14 编译时,上面的代码可以正常工作,但是当我用 C++17 编译时,它给了我这样的结果:
Inside: Base::Base()
Inside: int main()
如您所见,从未调用过 Base::~Base()。这对我来说没有多大意义。我已经在 Ubuntu 18.04.1 LTS 上使用 GCC 7.3.0 以及 OnlineGDB 测试了这段代码。它们都给出相同的结果。
我只是想知道这是 C++17 中的一个新特性还是一个错误?
更新:
我很清楚w->b 是一个悬空引用。实际上,我特意写了这段代码就是为了说明这一点。然后,我在测试时发现了这个问题。
我真正想知道的是这个问题有多严重,以防我不得不坚持使用 GCC 7.3?或者是否有任何其他方法可以重现相同的问题?还是缺陷报告?
【问题讨论】:
-
试试 gcc-8,它确实有析构函数。
-
鉴于
b是一个引用(而不是在函数内部),我希望 B 在这种情况下不会被破坏。 -
@KerrekSB 从那里很容易复制:只需将 wandbox 的 C++ 版本下拉菜单更改为 OP 指定的“gcc 7.3.0”。析构函数的输出消失了。
-
@EvenYoung:这是一个相关的错误:gcc.gnu.org/bugzilla/show_bug.cgi?id=82560,这也是:gcc.gnu.org/bugzilla/show_bug.cgi?id=83802
标签: c++ gcc language-lawyer c++17 object-lifetime