【发布时间】:2019-11-18 19:49:19
【问题描述】:
我刚刚开始在我的项目中使用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;
}
【问题讨论】:
-
是的,你的理解是正确的。
-
我认为在
std::variant中持有void*没有任何意义。如果您实际使用它,那么您使用std::variant的方式可能有问题。在std::variant中持有指针似乎已经不寻常了。你为什么要问void*而不是A*?可以肯定的是,如果变体持有A*,A对象也不会被销毁。 -
一个小修正(很抱歉吹毛求疵):析构函数本身不会释放
void *占用的内存,因为它没有存储在堆中。void *存储在变体的成员变量中(一种或另一种方式),因此当变体占用的内存被释放时,它所占用的内存也被释放。 -
这和
void*有什么关系?任何(原始)指针的行为方式都相同。 -
@DavisHerring 是的,你是对的。
标签: c++ memory-leaks c++17 void-pointers std-variant