如何使用std :: shared_ptr作为类成员?

时间:2016-12-03 10:03:45

标签: c++ c++11 memory-management smart-pointers

我需要创建一个这样的类。但是,当我运行此代码时,我得到:

"Error in `./a.out': free(): invalid next size (fast)"

MyClass有什么问题?如何正确使用shared_ptr作为类成员?

#include <memory>

class MyClass
{
public:
    MyClass(unsigned size) {
        _size = size;
        _arr = std::make_shared<int>(size);
        for (int i = 0; i < size; i++)
            _arr.get()[i] = 0;
    }

    MyClass(const MyClass& other) {
        _arr = other._arr;
        _size = other._size;
    }

    MyClass& operator=(const MyClass& other) {
        _arr = other._arr;
        _size = other._size;
    }

    void setArr(std::shared_ptr<int> arr, unsigned size) {
        _size = size;
        _arr = arr;
    }

    ~MyClass() {
        _arr.reset();
    }

private:
    std::shared_ptr<int> _arr;
    unsigned _size;
};

int main() {
    MyClass m(4);
    return 0;
}

谢谢,我误解了make_shared的含义。如果我想使用int *(不是std :: vector或std :: array),我应该写这个吗? (并且不要修复其他方法)

    MyClass(unsigned size) {
        _size = size;
        _arr = std::shared_ptr<int>(new int[size]);
        for (int i = 0; i < size; i++)
            _arr.get()[i] = 0;
    }

1 个答案:

答案 0 :(得分:3)

请查看std::make_shared的工作原理。

基本上, std :: make_shared

  

构造一个T类型的对象并将其包装在std :: shared_ptr

在你的情况下 T int ,所以 std :: make_shared 创建了一个 int 类型的对象,将它包装在 std :: shared_ptr 中。因此,内存分配给单个 int ,而不是 int 的数组,并且您的程序会导致 Undefined Behavior

我想您可以使用std::default_delete来避免问题:

_arr = std::shared_ptr<int>(new int[size], std::default_delete<int[]>());

另请注意:

  1. operator = 不返回任何内容。
  2. 您不应该使用下划线启动变量名称。
  3. 没有必要在类析构函数中为 _arr 调用 reset()