初始化shared_ptr <unit8_t>数据成员</unit8_t>

时间:2014-06-02 05:49:47

标签: c++

我在初始化一个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)),   免费);

当然,这并不能提供理想的结果。

2 个答案:

答案 0 :(得分:5)

我在您的代码中看到以下问题:

  1. 成员值初始化的语法。

    这个

    MyClass::MyClass() {
      this->data_((uint8_t *)malloc(sizeof(uint8_t)), free);
    }
    

    不是初始化成员变量的方式。

    MyClass::MyClass() : data_(value) {}
    

    是你如何做到的。

  2. 使用new而非shared_ptr时,您需要使用malloc来分配内存。通常,在使用C ++时,请使用new代替malloc

  3. <击> 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 listnew expressionmake_shared

NB。此代码剪辑使用shared_ptr,但实际上并没有共享任何内容。将shared_ptr用于未共享的数据是一种浪费。在这种情况下,请使用std :: unique_ptr或根本不使用指针。