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