首页 > 解决方案 > 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]

我在这里想念什么?

标签: c++c++11shared-ptr

解决方案


在构造函数内部,参数的名称隐藏了数据成员的名称;所以这些赋值就像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;
}

推荐阅读