【发布时间】:2015-09-25 17:09:00
【问题描述】:
我有一些代码声称拥有一系列原始指针的所有权,我想知道是否有一种可接受的方法来做到这一点?我正在寻找的是一种在更大程度上强制执行代码所有权的方法。主要是,我一直想知道我的构造函数是否应该直接采用唯一指针向量。
作为旁注,一旦获得所有权,数据就应该是不可变的。
代码大致遵循下面class X的模式。
#include <iostream>
#include <memory>
#include <vector>
using namespace std; // For readability purposes only
class X {
public:
const vector< unique_ptr<const int> > data; // In my case this is private
// Constructor: X object will take ownership of the data
// destroying it when going out of scope
X (vector<int*> rawData)
: data { make_move_iterator(rawData.begin()), make_move_iterator(rawData.end()) }
{ }
};
int main() {
// Illustrating some issues with claiming ownership of existing pointers:
vector<int*> rawData { new int(9) , new int(4) };
int* rawPointer = rawData[0];
{ // New scope
X x(rawData);
cout << *(x.data[0]) << endl; // Unique pointer points to 9
*rawPointer = 7;
cout << *(x.data[0]) << endl; // Unique pointer points to 7
}
cout << *rawPointer << endl; // The pointer has been deleted, prints garbage
return 0;
}
【问题讨论】:
-
单个拥有的原始指针已经够糟糕了。拥有原始指针的向量?就反模式而言,这很难被击败。
-
请使用
unique_ptr。 -
这里不需要移动迭代器,因为
int*没有移动构造函数... -
“我一直在想我的构造函数是否应该直接采用唯一指针向量”——是的,请。
-
如果
rawData的构造抛出分配它的缓冲区,初始化列表中的消息就会泄露。如果data的构造在分配其缓冲区时抛出,则所有rawPointer都会泄漏。您必须立即拥有那些已分配的指针以实现基本的异常安全。
标签: c++ pointers c++11 constants unique-ptr