复制为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
正确包装原始数组?
答案 0 :(得分:6)
shared_ptr
作为默认智能指针。多数民众赞成unique_ptr
。 shared_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) } {}