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



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

"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

在您的情况下将其包装在A std :: shared_ptr 中。结果,为单个 int 分配了内存,而不是为 int s的数组,您的程序导致 undfined行为。。

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

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

还请注意,

  1. 您的 operator = 什么都没有返回。
  2. 您不应该使用下划线开始变量名称。
  3. 无需在类destructor中为 _arr 调用 reset()

相关内容

  • 没有找到相关文章

最新更新