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++ 中的编译器警告没有标准。因此每个编译器都可以在他想要的任何地方警告你,这是一个选择问题

在你的情况下警告确实有意义,因为默认析构函数可能不被视为引用(例如:所有局部变量默认在其作用域结束时销毁).

Trivial destructor

如果满足以下所有条件,class T 的析构函数是微不足道的:

  • 析构函数不是用户提供的(也就是说,它是隐式声明的,或者在其第一次声明时明确定义为默认值)
  • 析构函数不是虚拟的(即基础class析构函数不是虚拟的)
  • 所有直接基 classes 都有平凡的析构函数
  • 所有 class 类型的非静态数据成员(或 class 类型的数组)都有平凡的析构函数。

普通析构函数是不执行任何操作的析构函数。具有普通析构函数的对象不需要 delete-expression 并且可以通过简单地释放它们的存储来处理。