Cha*_*how -1 c++ pointers memory-management smart-pointers dynamic-memory-allocation
根据这篇文章,使用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?
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 次 |
| 最近记录: |