shared_ptr use_count() return 赋值运算符(=)后0
shared_ptr use_count() return 0 after assignment operator (=)
我是 shared_ptr
的新手,无法解决这个问题,
我想在自定义 struct
中存储 shared_ptr
。
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]
我在这里错过了什么?
在构造函数中,参数的名称隐藏数据成员的名称;所以像 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;
}
我是 shared_ptr
的新手,无法解决这个问题,
我想在自定义 struct
中存储 shared_ptr
。
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]
我在这里错过了什么?
在构造函数中,参数的名称隐藏数据成员的名称;所以像 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;
}