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

时间:2014-06-03 22:08:41

标签: c++ pointers memory-management smart-pointers dynamic-memory-allocation

复制为shared_ptr to an array : should it be used?


根据this post,使用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;
    }  

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

1 个答案:

答案 0 :(得分:6)

不要使用shared_ptr作为默认智能指针。

多数民众赞成unique_ptrshared_ptr对应共享所有权。你想要独特的所有权。

更多信息here


重新分配智能指针

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

相反,写一下

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

或直接使用初始化列表:

myClass::myClass(int myArraySize) :
    myArray{ std::make_shared<int>(myArraySize) } {}

但你想要一个阵列!

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

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

std::unique_ptr<int[]> myArray;

// [...]

myClass::myClass(int myArraySize) :
    myArray{ new int[myArraySize]() } {}
    // value-initialized it

或者自C ++ 1y(或使用自己的定义)以及make_unique

myClass::myClass(int myArraySize) :
    myArray{ std::make_unique<int[]>(myArraySize) } {}