我在初始化一个shared_ptr类型的私有数据成员时遇到了问题。
标题
class MyClass {
private:
std::shared_ptr<uint8_t> data_;
public:
uint8_t data();
}
实施
MyClass::MyClass() {
this->data_((uint8_t *)malloc(sizeof(uint8_t)), free);
}
错误:
错误:类型'shared_ptr'不提供调用操作符
然而,这确实有效:
std :: shared_ptr data((uint8_t *)malloc(sizeof(uint8_t)), 免费);
当然,这并不能提供理想的结果。
答案 0 :(得分:5)
我在您的代码中看到以下问题:
成员值初始化的语法。
这个
MyClass::MyClass() {
this->data_((uint8_t *)malloc(sizeof(uint8_t)), free);
}
不是初始化成员变量的方式。
MyClass::MyClass() : data_(value) {}
是你如何做到的。
使用new
而非shared_ptr
时,您需要使用malloc
来分配内存。通常,在使用C ++时,请使用new
代替malloc
。
<击> 3。 malloc
的参数太多了。
您需要为您的特定班级做些什么:
MyClass::MyClass() : data_(std::make_shared<uint8_t>()) {
}
<强>更新强>
上述第3点不正确。我误读了malloc
的论点(感谢@MikeSeymour)。 free
被传递给shared_ptr
的构造函数,这是构造shared_ptr
的有效方法。
即使
std::shared_ptr<uint8_t> ptr(malloc(sizeof(uint8_t)), free);
是构建shared_ptr
的有效方式,使用
std::shared_ptr<uint8_t> ptr(new sizeof(uint8_t)));
或
std::shared_ptr<uint8_t> ptr(make_shared<uint8_t>());
将malloc
用于uint8_t
可能是无害的,因为shared_ptr
指向的值可以在变量初始化后设置为合理的值。但是,对于任何稍微复杂的东西使用malloc
都需要将对象的所有成员正确设置为合理值的代码。如果对象类型具有虚拟成员函数,我不确定malloc
方法是否会起作用。
答案 1 :(得分:2)
您正在寻找
MyClass::MyClass () : data_(new uint8_t) {
}
或(更好)
MyClass::MyClass () : data_(std::make_shared<uint8_t>()) {
}
概念:member initializer list,new expression, make_shared
NB。此代码剪辑使用shared_ptr,但实际上并没有共享任何内容。将shared_ptr用于未共享的数据是一种浪费。在这种情况下,请使用std :: unique_ptr或根本不使用指针。