shared_ptr use_count () возвращает 0 после оператора присваивания (=) - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в 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]

что мне здесь не хватает?

1 Ответ

5 голосов
/ 18 июня 2020

Внутри конструктора имена параметров скрывают имена членов данных; поэтому эти назначения, такие как 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;
}
...