如何使用智能指针包装数组?

Cha*_*how -1 c++ pointers memory-management smart-pointers dynamic-memory-allocation

shared_ptr复制到数组:是否应该使用它?


根据这篇文章,使用smart_ptr包装数组的好方法是定义一个删除函数,并将删除函数单独传递给带有原始数组的smart_ptr.


我将重构我的代码,比如使用smart_ptr包装原始数组.这是一个例子:

原始代码:

    class MyList{
    public:
       MyList(int size = 0);
       void Resize(int size);
       ~MyList();
    private:
       int* myArray; 
       int* head_;
       size_t size_;
    }

    MyList::MyList(int size){
        myArray = new int[size]; //allocated memory when object is being created 
        head_ = list_;
        size_ = size;
    }

    void MyList::Resize(int size) {
        if (!list_) {
             delete myArray;
             size_ = 0;
        }
        myArray = new int[size];
        head_ = list_;
        size_ = size;
    }

    MyList::~MyList(){
       delete myArray;
       head = null_ptr;
    }  
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何正确包装原始数组smart_ptr

Col*_*mbo 6

不要shared_ptr用作默认的智能指针.

多数民众赞成unique_ptr.shared_ptr对应共享所有权.你想要独特的所有权.

更多信息在这里.


重新分配智能指针

智能指针不能分配给原始指针.这有充分的理由.

相反,写

myArray = std::make_shared<int>( myArraySize );
// Creates ONE int-object, which is initialized to myArraySize
Run Code Online (Sandbox Code Playgroud)

或者直接使用初始化列表:

myClass::myClass(int myArraySize) :
    myArray{ std::make_shared<int>(myArraySize) } {}
Run Code Online (Sandbox Code Playgroud)

但是你想要一个阵列!

首先,您应该使用std::size_t指定数组边界.

现在到设置正确的智能指针并初始化它的实际代码:

std::unique_ptr<int[]> myArray;

// [...]

myClass::myClass(int myArraySize) :
    myArray{ new int[myArraySize]() } {}
    // value-initialized it
Run Code Online (Sandbox Code Playgroud)

或者从C++ 1y(或使用自己的定义)开始make_unique:

myClass::myClass(int myArraySize) :
    myArray{ std::make_unique<int[]>(myArraySize) } {}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

611 次

最近记录:

10 年,8 月 前