我刚刚开始在我的项目中使用 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/