我在我的代码中使用了一个inplace析构函数,类似于这个被剥离的代码段:
#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中给出了一个警告,包括Debug和Release:
警告C4189:’b’:局部变量已初始化但未引用
即使使用-Wall,它也能很好地编译.知道为什么我会收到警告吗?这可能是编译器中的错误吗? b明显用于b-> ~Node()调用.
当我将Node实现更改为此时,似乎编译正常:
struct Node { ~Node() { } };
但据我所知,这不应该有所作为.
解决方法
C中没有编译器警告的标准.因此,每个编译器都可以在任何他想要的地方发出警告,这是一个选择问题.
在您的情况下,警告确实有意义,因为默认析构函数可能不会被视为引用(例如:所有局部变量默认在其作用域的末尾被销毁).