C ++ inplace析构函数编译警告

我在我的代码中使用了一个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);
}

不幸的是,在Debug和Release中,这给了我一个Visual Studio 2015的警告:

warning C4189: 'b': local variable is initialized but not referenced

它在g ++中编译得很好,即使在-Wall中也是如此。 任何想法为什么我得到警告? 可能这是编译器中的一个错误? b明确地用在b->~Node()调用中。

当我将Node实现更改为这个时,它似乎也很好编译:

struct Node {
    ~Node() {
    }
};

但据我所知,这不应该有所作为。


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

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


微不足道的析构函数

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

  • 析构函数不是用户提供的(也就是说,它是隐式声明的,或者在其第一个声明中被显式定义为默认)
  • 析构函数不是虚拟的(也就是说,基类析构函数不是虚拟的)
  • 所有的直接基类都有微不足道的析构函数
  • 类类型(或类类型数组)的所有非静态数据成员都具有微不足道的析构函数。
  • 一个简单的析构函数是一个不执行任何操作的析构函数。 带有琐碎析构函数的对象不需要delete-expression,并且可以通过简单地释放其存储来处理。

    链接地址: http://www.djcxy.com/p/94711.html

    上一篇: C++ inplace destructor compile warning

    下一篇: Keep Matlab from stepping into built in functions during dbstop if error