c++ - 如果 std::variant 包含 void* 数据,它的析构函数会做什么

标签 c++ memory-leaks c++17 void-pointers std-variant

我刚刚开始在我的项目中使用 std::variant。我有个疑问。 std::variant 的析构函数在下面显示的代码中会做什么。 Variant 持有一个 void* 数据。一旦 variant 超出范围,我认为它只会释放 void* 的内存,而不是指针指向的实际对象。所以这种情况下会出现内存泄漏。我想知道我的理解是否正确。

#include <iostream>
#include <memory>
#include <variant>
using namespace std;

class A {
    public:
    ~A(){
        cout<<"Destructor called"<<endl;
    }
};


int main() {
    std::variant<void*> data;
    A* b = new A();
    data = (void*)b;
    return 0;
}

最佳答案

当变体析构函数触发时,它将为此时存储在变体中的任何类型的项目调用析构函数。如果那是一个 void*,那么 C++ 会说“好的,我将清理 void*,因为这是一个基本类型,所以这是一个空操作。”它不会查看 void*,意识到它实际上是指向 A 的指针,然后delete 指针,就好像它是一个A*

评论指出使用 void* 的变体是相当不寻常的。 void* 表示“我正指向某物,作为用户,由您来跟踪它是什么并进行适当的转换和资源管理。”变体意味着“我持有以下实际事物之一,我希望 C++ 记住哪一个并为我进行适当的资源管理。”您可能需要重新考虑您的设计,因为可能有一种更简单的方法来完成您打算在这里完成的任何事情。

关于c++ - 如果 std::variant 包含 void* 数据,它的析构函数会做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921893/

相关文章:

c++ - 使用 Homebrew 安装 C++ 库

c++ - 对象 : Cannot create children for a parent that is in a different thread

c++ - 如何制作 boost.Test 日志/打印标准类型

c++ - 是否可以在 std::any 中存储引用?

c++ - 如何跟踪 float 中的小数?

c++ - 生成不重复的字符串排列

.net - 表NewRow()导致内存泄漏

c++ - 如果由于接收对象的线程已结束而未处理 Qt 信号,是否会删除参数?

apache-flex - 组件没有得到垃圾收集

c++ - 在 C++ 中将序列日期 (Excel) 转换为年月日的算法