c++ - shared_ptr use_count() 在赋值运算符 (=) 后返回 0
问题描述
我是新手,shared_ptr
无法解决这个问题,
我想存储shared_ptr
在 custom 中struct
。
struct ThreadSafeQMsg
{
ThreadSafeQMsg(shared_ptr<ptree> control, shared_ptr<uint32_t> data=0, int data_size=0) {
data_size = data_size;
data = data;
control = control;
}
size_t data_size;
shared_ptr<ptree> control;
shared_ptr<uint32_t> data;
};
ThreadSafeQMsg* tmsg = new ThreadSafeQMsg(control,spData, data_size);
PRINT_LOG("message with data[" << std::dec << tmsg->data_size << ",ref: " << std::dec << tmsg->data.use_count()
<< "] & control[ref: " << std::dec << tmsg->control.use_count() << "]");
在分配之前,我看到在分配后检查时引用计数为 1,我得到:
message with data[140737018606128,ref: 0] & control[ref: 0]
我在这里想念什么?
解决方案
在构造函数内部,参数的名称隐藏了数据成员的名称;所以这些赋值就像data_size = data_size;
只是将参数分配给自己,与保持默认初始化的数据成员无关。
您可以在成员初始化程序列表中将它们初始化为
ThreadSafeQMsg(shared_ptr<ptree> control, shared_ptr<uint32_t> data=0, int data_size=0)
: data_size(data_size),
control(control),
data(data) {
}
或者,如果您想坚持分配(但通常应用成员初始值设定项列表更好)。
ThreadSafeQMsg(shared_ptr<ptree> control, shared_ptr<uint32_t> data=0, int data_size=0) {
this->data_size = data_size;
this->data = data;
this->control = control;
}
推荐阅读
- java - 为什么 h.print_for() 会在 g.print_for() 正常工作时给出错误消息?
- python - 我怎样才能从右到左定位框架没有边距
- apache-spark - Spark master 无法远程启动工作人员,但工作人员在使用 ssh 时正常启动
- java - 调试用户应用程序中的错误。有可能的?
- javascript - Tailwind CSS:无法将 undefined 或 null 转换为对象 & getProcessedPlugins 不是函数
- histogram - Tableau:将多个时间相关直方图子集为多行和多列以适应屏幕
- django - 登录后 Django 不会重定向到个人资料页面。我的代码有什么问题?
- c++ - 'var' 的多重定义;obj/Class.o:(.bss+0x0): 首先定义在这里
- variables - 获取Lua中同名变量的内容
- vba - VBA WORD 2019 重新设计的注释。寻找诸如“评论已添加”或“评论已更改”之类的事件以在之后自动更正评论文本