Search code examples
c++c++11shared-ptr

shared_ptr use_count() return 0 after assignment operator (=)


Im new to shared_ptr and can't wrap my around this,

I want to store shared_ptr in 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() << "]");

before assignment I see the that the ref count is 1 when checking after assignment I get:

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

what am I missing here?


Solution

  • Inside the constructor, the names of parameters hide the names of data members; so these assignments like 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;
    }