C++ 就地析构函数编译警告

标签 c++ visual-studio visual-studio-2015 destructor compiler-warnings

我在我的代码中使用了一个就地析构函数,类似于这段精简的代码:

#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/

相关文章:

c++ - Cython C++ 和 std::string

c# - Interop.xxxxx.dll 是如何生成的?

visual-studio - `dotnet sln add` 错误的项目类型 GUID

java - 有没有办法在 Visual Studio 2015 上进行 Java 编程

c# - 使用同一个 dll 的 2 个不同版本?

java - C#/Java如何存储二维数组,与C++有何不同?

运行时的 C++ 编译

visual-studio - 为什么重启后我的 key 容器会丢失?

tfs - 查找并删除 csproj 文件中的重复条目

c++ - 在不同线程中启动服务器和 IHM