c++ - 如果 std::variant 的析构函数包含 void* 数据,它会做什么
问题描述
我刚刚开始std::variant
在我的项目中使用。我有个疑问。std::variant
下面显示的代码中的析构函数会做什么。Variant 保存void*
数据。一旦变体超出范围,我认为它只会释放内存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*
,意识到它实际上是一个指向 an 的指针A
,然后delete
把指针当成一个A*
.
评论指出,使用 a 的变体是相当不寻常的void*
。A 的void*
意思是“我指的是某个东西,作为用户,你需要跟踪它是什么,并进行适当的投射和资源管理。” 变体意味着“我持有以下实际事物之一,我希望 C++ 记住哪一个并为我进行适当的资源管理。” 您可能需要重新考虑您的设计,因为可能有一种更简单的方法来做您打算在这里做的任何事情。
推荐阅读
- abap - SELECT 的内联数据后出错:“不包含结构...”
- c# - 在 asp.net core 3 中设置 httpcontext
- javascript - 当按下 ENTER 或按下它的按钮时,使表单运行 javascript,而不提交
- c# - 绑定 WPF C# 后,MVVM 中 DataGridListView 的 SelectedItem 为空
- flutter - 如何自定义 CupertinoTabBar
- image - 是否可以将图像用于 ipywidget 按钮
- android - 如何收听android MediaPlayer位置变化事件
- javascript - 如何查看我未创建的网站的 .js 文件
- arrays - 使用巨大的 Numpy 数组而不将其全部存储在内存中
- c++ - 为什么 fwrite / fread 不像 56.806201550387598?