gpt4 book ai didi

c++ - std::shared_ptr 未更新其计数

转载 作者:行者123 更新时间:2023-11-28 01:22:31 26 4
gpt4 key购买 nike

我正在尝试创建一个自定义网络 class Tile在另一个里面 class Board它正在存储 std::array<std::shared_ptr<Tile>, 34> .我正在使用 std::shared_ptr<Tile> class Tile 中的对象显示哪些节点已连接。然而,当我初始化每个 34 Tile对象,列表中包含的尚未初始化的对象不会从 nullptr 更新供他们自己引用。

#include <memory>
#include <array>
#include <cstddef>

struct Tile;
template <const std::size_t N> using TileLink = std::array<const std::shared_ptr<const Tile>, N>;
template <const std::size_t N> using TileArray = std::array<std::shared_ptr<const Tile>, N>;

struct Tile {
/* surrounding tiles */
const std::size_t ID;
const std::size_t num_adj;
const TileLink<6> adjacent;
Tile (std::size_t id, std::size_t n, const TileLink<6> & arr) : ID (id), num_adj (n), adjacent (arr) { }
~Tile (void) = default;
};

class Board {
private:
TileArray<34> tiles;
public:
Board (void);
~Board (void) = default;
};

Board :: Board (void) {
/* Column 1 */
tiles[0] = std::make_shared<Tile> ( 0, 3, TileLink<6>{ tiles[1], tiles[4], tiles[5], nullptr, nullptr, nullptr });
tiles[1] = std::make_shared<Tile> ( 1, 4, TileLink<6>{ tiles[0], tiles[2], tiles[5], tiles[6], nullptr, nullptr });
tiles[2] = std::make_shared<Tile> ( 2, 3, TileLink<6>{ tiles[1], tiles[6], tiles[7], nullptr, nullptr, nullptr });
/* Column 2 */
tiles[3] = std::make_shared<Tile> ( 3, 2, TileLink<6>{ tiles[4], tiles[9], nullptr, nullptr, nullptr, nullptr });
tiles[4] = std::make_shared<Tile> ( 4, 5, TileLink<6>{ tiles[0], tiles[3], tiles[5], tiles[9], tiles[10], nullptr });
tiles[5] = std::make_shared<Tile> ( 5, 6, TileLink<6>{ tiles[0], tiles[1], tiles[4], tiles[6], tiles[10], tiles[11] });
tiles[6] = std::make_shared<Tile> ( 6, 6, TileLink<6>{ tiles[1], tiles[2], tiles[5], tiles[7], tiles[11], tiles[12] });
tiles[7] = std::make_shared<Tile> ( 7, 5, TileLink<6>{ tiles[2], tiles[6], tiles[8], tiles[12], tiles[13], nullptr });
tiles[8] = std::make_shared<Tile> ( 8, 2, TileLink<6>{ tiles[7], tiles[13], nullptr, nullptr, nullptr, nullptr });
/* Columns 4 - 6 */
...
...
...
/* Column 7 */
tiles[31] = std::make_shared<Tile> (31, 3, TileLink<6>{ tiles[26], tiles[27], tiles[32], nullptr, nullptr, nullptr });
tiles[32] = std::make_shared<Tile> (32, 4, TileLink<6>{ tiles[27], tiles[28], tiles[31], tiles[33], nullptr, nullptr });
tiles[33] = std::make_shared<Tile> (33, 3, TileLink<6>{ tiles[28], tiles[29], tiles[32], nullptr, nullptr, nullptr });
}

std::array我正在传递给 Tile构造函数不变。我该如何改变它?

如有任何帮助,我们将不胜感激。抱歉让这个问题这么长,我真的不知道如何把它变成一个更小的例子。

最佳答案

这里:

tiles[0]  = std::make_shared<Tile> ( 0, 3, TileLink<6>{ tiles[1],  tiles[4],  tiles[5],  nullptr,   nullptr,   nullptr   });

tiles[1]tiles[4] 等尚未初始化,并且是 shared_ptr 到 nullptr。当您稍后初始化 tiles[1] 时,它不会更改 tiles[0] 中的内容。

您完全在滥用 shared_ptr。由于您的 tile 数组具有固定大小,因此只需分配一次所有需要的内存,然后使用非拥有指针。因为内存的所有者,它是 Board

关于c++ - std::shared_ptr 未更新其计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55474395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com