简体   繁体   English

shared_ptr use_count() 在赋值运算符 (=) 后返回 0

[英]shared_ptr use_count() return 0 after assignment operator (=)

Im new to shared_ptr and can't wrap my around this,我是shared_ptr的新手,无法解决这个问题,

I want to store shared_ptr in custom struct .我想将shared_ptr存储在自定义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() << "]");

before assignment I see the that the ref count is 1 when checking after assignment I get:在分配之前,我看到在分配后检查时引用计数为 1,我得到:

message with data[140737018606128,ref: 0] & control[ref: 0]

what am I missing here?我在这里想念什么?

Inside the constructor, the names of parameters hide the names of data members;在构造函数内部,参数的名称隐藏了数据成员的名称; so these assignments like data_size = data_size;所以这些赋值像data_size = data_size; are just assigning the parameters to themselves and have nothing to do with the data members, which are kept default-initialized.只是将参数分配给自己,与保持默认初始化的数据成员无关。

You can initialize them in member initializer list as您可以在成员初始化程序列表中将它们初始化为

ThreadSafeQMsg(shared_ptr<ptree> control, shared_ptr<uint32_t> data=0, int data_size=0) 
  : data_size(data_size), 
    control(control), 
    data(data) {
}

Or if you want to stick to assignment (but applying member initializer list is better in general).或者,如果您想坚持分配(但通常应用成员初始值设定项列表更好)。

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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM