所有shared_ptr都指向我的向量中的同一指针



我创建了一个shared_ptr类向量的向量(_cells(。

class Goban
{
public:
Goban();
~Goban();
private:
vector<vector<shared_ptr<Cell>>> _cells;
};

我这样初始化:

Goban::Goban() : _cells(18, vector<shared_ptr<Cell>>(18, make_shared<Cell>()))
{
}

问题是所有指针都动态地引用同一个指针(如果我理解正确的话(。因此,当我使用向量更改类Cell中的一个元素时,它会更改所有其他元素。

问题是所有指针都动态引用同一指针

这是因为您使用了向量的构造函数,该构造函数生成值参数的N个副本。共享指针的副本指向共享对象。

我想要单独的指针

然后不要使用向量的构造函数。您可以编写一个循环,调用make_shared来创建每个元素,并为每个向量重复一个循环。

要获得18x18个不同的shared_ptrs,初始化_cells的正确方法可能是:

Goban::Goban() : _cells(18, std::vector<std::shared_ptr<Cell>>(18))) {
for (auto& cs : _cells)
for (auto& c : cs)
c = std::make_shared<Cell>();
}

Goban::Goban() : _cells(18) {
for (auto& cs : _cells) {
cs.resize(18);
for (auto& c : cs)
c = std::make_shared<Cell>();
}
}

只需在构造函数体中而不是在初始化器列表中显式初始化向量。

Goban::Goban()
{
for (int i = 0 ; i < 18; i++) {
_cells.push_back(make_shared<Cell>());
}
}

相关内容

  • 没有找到相关文章

最新更新