【发布时间】:2017-05-17 10:02:03
【问题描述】:
我在我的代码中使用了就地析构函数,类似于这段精简的代码:
#include <new>
#include <stdlib.h>
struct Node {
};
int main(int, char**) {
Node* a = reinterpret_cast<Node*>(malloc(sizeof(Node)));
new(a) Node;
Node* b = a;
b->~Node();
free(a);
}
不幸的是,这在 Visual Studio 2015 中给了我一个警告,包括调试和发布:
warning C4189: 'b': local variable is initialized but not referenced
尽管在 g++ 中编译良好,即使使用 -Wall。知道为什么我会收到警告吗?这可能是编译器中的错误吗? b 在b->~Node() 调用中明显使用。
当我将 Node 实现更改为此时,它似乎也可以正常编译:
struct Node {
~Node() {
}
};
但据我所知,这应该没什么区别。
【问题讨论】:
-
嗯,我的猜测是优化器完全忽略了对默认析构函数的调用,然后得出结论,从未使用过
b。您是仅在编译优化的构建时看到此警告,还是在未优化/调试的构建中也看到它? -
它也在调试版本中
-
有趣。是的,我在 32 位和 64 位版本以及 VS 2010、2012 和 2015 上都启用和禁用了优化器。这对我来说似乎是一个错误,除非我还遗漏了一些明显的东西。 (它在优化构建中省略了对析构函数的调用,当然,事实上,也省略了对构造函数的调用。目标代码仅调用
malloc和free。) -
很明显,b 正在被使用。因此这是一个编译器错误。
-
我也投票支持编译器错误。
标签: c++ visual-studio visual-studio-2015 destructor compiler-warnings