gpt4 book ai didi

c++ - boost::variant 对象构建计数 VS 销毁计数

转载 作者:行者123 更新时间:2023-11-28 03:22:37 26 4
gpt4 key购买 nike

我已经使用 boost::variant 一段时间了,现在我正试图弄清楚它的内部工作原理。我写了一个简单的测试,我看不懂结果。这是(简化)

struct my_type
{
my_type(){ cout << (size_t)this << " construction"; }
~my_type(){ cout << (size_t)this << " destruction"; }
};

int main()
{
variant<int, my_type> x;
x = my_type();
}

这个程序的输出是

140736940365327 construction  <-- A
140736940365236 destruction <-- ?
140736940365327 destruction <-- A
140736940365332 destruction <-- ?

为什么析构函数的调用次数不如构造函数?由于在堆上调用析构函数,我知道这可能不是段错误,但在我看来这种行为很危险。我错过了什么吗?这与 boost::variant 的“备份”机制有关吗?

最佳答案

您只定义了一个默认构造函数,当然也可以使用各种参数调用构造函数。由于您没有显式定义复制构造函数(采用 const my_type& 的构造函数),编译器会隐式为您生成一个。如果您添加自己的复制构造函数,您应该看到它用于构造其他两个神秘对象:

struct my_type
{
my_type(){ cout << (size_t)this << " construction"; }
my_type(const my_type&){ cout << (size_t)this << " copy construction"; }
~my_type(){ cout << (size_t)this << " destruction"; }
};

事实上,如果您使用的是 C++11 编译器,则隐式生成的移动构造函数将负责一些新对象。如果你像上面那样提供一个复制构造函数,那么隐式移动构造函数就不再生成,所以它们都显示为复制构造。但是,如果您也提供移动构造函数,您会发现它被调用:

struct my_type
{
my_type(){ cout << (size_t)this << " construction"; }
my_type(const my_type&){ cout << (size_t)this << " copy construction"; }
my_type(my_type&&){ cout << (size_t)this << " move construction"; }
~my_type(){ cout << (size_t)this << " destruction"; }
};

关于c++ - boost::variant 对象构建计数 VS 销毁计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15040469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com