C++ 就地析构函数编译警告
C++ inplace destructor compile warning
我在我的代码中使用了一个就地析构函数,类似于这段精简的代码:
#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 中给了我一个警告:
warning C4189: 'b': local variable is initialized but not referenced
它在 g++ 中编译得很好,即使使用 -Wall。知道为什么我会收到警告吗?这可能是编译器中的错误吗? b 显然在 b->~Node()
调用中使用。
当我将 Node 实现更改为此时,它似乎也可以正常编译:
struct Node {
~Node() {
}
};
但据我所知,这应该没有什么不同。
C++ 中的编译器警告没有标准。因此每个编译器都可以在他想要的任何地方警告你,这是一个选择问题。
在你的情况下警告确实有意义,因为默认析构函数可能不被视为引用(例如:所有局部变量默认在其作用域结束时销毁).
如果满足以下所有条件,class T 的析构函数是微不足道的:
- 析构函数不是用户提供的(也就是说,它是隐式声明的,或者在其第一次声明时明确定义为默认值)
- 析构函数不是虚拟的(即基础class析构函数不是虚拟的)
- 所有直接基 classes 都有平凡的析构函数
- 所有 class 类型的非静态数据成员(或 class 类型的数组)都有平凡的析构函数。
普通析构函数是不执行任何操作的析构函数。具有普通析构函数的对象不需要 delete-expression 并且可以通过简单地释放它们的存储来处理。
我在我的代码中使用了一个就地析构函数,类似于这段精简的代码:
#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 中给了我一个警告:
warning C4189: 'b': local variable is initialized but not referenced
它在 g++ 中编译得很好,即使使用 -Wall。知道为什么我会收到警告吗?这可能是编译器中的错误吗? b 显然在 b->~Node()
调用中使用。
当我将 Node 实现更改为此时,它似乎也可以正常编译:
struct Node {
~Node() {
}
};
但据我所知,这应该没有什么不同。
C++ 中的编译器警告没有标准。因此每个编译器都可以在他想要的任何地方警告你,这是一个选择问题。
在你的情况下警告确实有意义,因为默认析构函数可能不被视为引用(例如:所有局部变量默认在其作用域结束时销毁).
如果满足以下所有条件,class T 的析构函数是微不足道的:
- 析构函数不是用户提供的(也就是说,它是隐式声明的,或者在其第一次声明时明确定义为默认值)
- 析构函数不是虚拟的(即基础class析构函数不是虚拟的)
- 所有直接基 classes 都有平凡的析构函数
- 所有 class 类型的非静态数据成员(或 class 类型的数组)都有平凡的析构函数。
普通析构函数是不执行任何操作的析构函数。具有普通析构函数的对象不需要 delete-expression 并且可以通过简单地释放它们的存储来处理。