c++ - C++ shared_ptr 调用拥有对象的解构器
问题描述
我有这个代码
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 上的解构器只会被调用一次。
有人知道第二次打电话的原因吗?
解决方案
有人知道第二次打电话的原因吗?
因为构造了两个对象。使用,首先构造std::make_shared<TC>(TC());
一个临时对象,然后将其复制以构造由 . 管理的第二个对象。TC
TC()
std::shared_ptr
您可以添加复制/移动构造函数以获得更清晰的观察;你会看到两次建设和两次破坏。例如
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>();
.
推荐阅读
- python - python - 发送带有 3 个反斜杠的命令
- unicode - 应用程序如何知道字符编码?
- json - 通过单个字符串访问嵌套的 JSON 对象属性
- javascript - 如何在jslt foreach循环内的html元素上触发onchange事件?
- datastage - DataStage中Change Capture阶段和Difference阶段的区别
- angular - Angular 7 在 docker 中不工作,npm 安装不继续
- python - 如何在 django 查询集中知道某些对象的顺序
- bluetooth-lowenergy - nRF52832 Sparkfun 分线板的 I2C 引脚需要上拉电阻吗?
- regex - 在弹性搜索查询中无法逃脱 +
- sequelize.js - foreignKey undefined belongsToMany 关联