繁体   English   中英

如何将std :: shared_ptr用作类成员?

[英]How to use std::shared_ptr as class member?

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

"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;
    }

请看看std :: make_shared如何工作。

基本上, std :: make_shared

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

在您的情况下Tint ,因此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. 您的运算子=不返回任何内容。
  2. 您不应该在变量名下加下划线。
  3. 不必在类析构函数中为_arr调用reset()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM