【问题标题】:shared_ptr use_count() return 0 after assignment operator (=)shared_ptr use_count() 在赋值运算符 (=) 后返回 0
【发布时间】:2020-10-08 07:16:14
【问题描述】:

我是 shared_ptr 的新手,无法理解这一点,

我想将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() << "]");

在分配之前,我看到引用计数为 1 在分配后检查时,我得到:

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

我在这里错过了什么?

【问题讨论】:

  • 虽然不是必需的,但为了安全起见,构造函数参数的命名方式最好与成员变量不同。

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


【解决方案1】:

在构造函数内部,参数的名字隐藏数据成员的名字;所以像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;
}

【讨论】:

  • 或者避免使用this-&gt;,而是使用前缀或后缀,例如m_data_size,但这样我们就进入了危险的辩论领域:-)
  • @underscore_d 是的,它非常基于意见。 :)
猜你喜欢
  • 2013-02-17
  • 2019-12-29
  • 2022-01-03
  • 2015-07-16
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多