如何使用智能指针来管理现有对象

qiu*_*qiu 0 c++ class smart-pointers object unique-ptr

假设我有一个从某些 API 生成的数据向量。它仅用于绘图。

vector<double> LineData = generateData();
Run Code Online (Sandbox Code Playgroud)

我还有一个类可以进行绘图和管理数据

class LineChart
{
public:
    LineChart(vector* data):m_data{data}{}
    vector<double> *m_data;
    void plot();
};

LineChart lc {&LineData}
Run Code Online (Sandbox Code Playgroud)

由于向量仅用于绘图,因此我希望该类拥有完全所有权。所以我想将原始指针更改为 unique_ptr。

通常,unique_ptr 是从 new 或 make_unique 创建的,而不是现有对象。我可以复制该向量,然后将其移至班级。

unique_ptr<vector> data = make_unique<vector>(LineData)
Run Code Online (Sandbox Code Playgroud)

但是复制向量会产生不必要的开销,因为我已经有了数据。此外,原始向量在堆栈上变得重复并且不执行任何操作。

那么在这种情况下,是否有一些有效的方法将现有对象的所有权传递给类?最好的做法是什么?

joh*_*ohn 8

这里没有理由使用任何类型的指针,只需将数据移动到位即可。不会发生向量的复制。

class LineChart
{
public:
    LineChart(vector data):m_data{std::move(data)}{}
    vector<double> m_data;
    void plot();
};

LineChart lc {std::move(LineData)};
Run Code Online (Sandbox Code Playgroud)

您也可以直接初始化而不使用LineData变量

LineChart lc {generateData()};
Run Code Online (Sandbox Code Playgroud)

这里std::move没有必要,因为generateData函数的返回值是临时的,会自动移动。