我在我的代码中使用了一个就地析构函数,类似于这段精简的代码:
#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 中给了我一个警告,包括调试和发布:
警告 C4189:“b”:局部变量已初始化但未被引用
它在 g++ 中编译得很好,即使使用 -Wall。知道为什么我会收到警告吗?这可能是编译器中的错误吗? b 显然用于 b->~Node()
调用。
当我将 Node 实现更改为此时,它似乎也可以正常编译:
struct Node {
~Node() {
}
};
但据我所知,这应该没有什么不同。
最佳答案
C++ 中没有编译器警告的标准。因此,每个编译器都可以在任何地方警告您,这是一个选择问题。
在您的情况下,警告确实有意义,因为默认析构函数可能不被视为引用(例如:所有局部变量默认在其作用域结束时被销毁)。
关于C++ 就地析构函数编译警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41441356/