gpt4 book ai didi

拥有对象的 C++ shared_ptr 调用析构函数

转载 作者:太空狗 更新时间:2023-10-29 20:01:53 27 4
gpt4 key购买 nike

我有这个代码

class TC
{
public:
TC()
{
i_idx = s_idx++;
Serial.printf("TC Construct %d\r\n", i_idx);
};

virtual ~TC()
{
Serial.printf("TC Deconstruct %d\r\n",i_idx);
};

int i_idx;
static int s_idx;
};

int TC::s_idx = 0;

void setup()
{
Serial.begin(115200);
Serial.printf("\r\n\nSetup start\r\n");
std::shared_ptr<TC> stc = std::make_shared<TC>(TC());
}

void loop()
{
}

执行时我得到结果:

Setup start
TC Construct 0
TC Deconstruct 0
TC Deconstruct 0

我预计当 shared_ptr 超出范围时,TC 上的解构函数只会被调用一次。

有人知道第二次打电话的原因吗?

最佳答案

Anyone knows the reason for the second call ?

因为构造了两个对象。与 std::make_shared<TC>(TC()); , 临时 TCTC() 构建首先,然后将其复制以构造由 std::shared_ptr 管理的第二个对象.

您可以添加复制/移动构造函数以便更清楚地观察;你会看到两次 build 和两次破坏。例如

class TC
{
public:
TC()
{
i_idx = s_idx++;
Serial.printf("TC Construct %d\r\n", i_idx);
}

TC(const TC&)
{
i_idx = s_idx++;
Serial.printf("TC copy Construct %d\r\n", i_idx);
}

TC(TC&&)
{
i_idx = s_idx++;
Serial.printf("TC move Construct %d\r\n", i_idx);
}

virtual ~TC()
{
Serial.printf("TC Deconstruct %d\r\n",i_idx);
}

int i_idx;
static int s_idx;
};

顺便说一句:对于这种情况,临时的是不必要的,您可能只需要 std::make_shared<TC>(); .

关于拥有对象的 C++ shared_ptr 调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50526650/

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