提问者:小点点

shared_ptr数较多的分段故障


这是我的。h文件:

class Node
    {
        
    public:
        static void disp(const std::vector<int> &v);
        static size_t Node_no;
        Node(const std::vector<int> & initial_state);
        ~Node();
        std::shared_ptr<std::vector<int>> val;
        std::shared_ptr<Node> up;
        std::shared_ptr<Node> down;
        std::shared_ptr<Node> right;
        std::shared_ptr<Node> left;
        std::shared_ptr<Node> parent;
    };

这是我的节点构造函数,它重置所有指针并将节点数增加1;

Board::Node::Node(const std::vector<int> &initial_state)
{
    val = std::make_shared<std::vector<int>>(move(initial_state));
    this->right.reset();
    this->left.reset();
    this->up.reset();
    this->down.reset();
    this->parent.reset();
    Node::Node_no++;
}

这是我的析构函数,只通过静态变量No_nodes减少节点数

Board::Node::~Node()
{
    if(Node::Node_no%10==0)
        std::cerr << "Node destructor:"<<Node::Node_no << std::endl;
    Node::Node_no--;
}

这是我的主要档案

int main()
{

    std::vector<int> init_vec = {2, 4, 6, 5, 8, 3, 0, 1, 7};
    std::vector<std::shared_ptr<Board::Node>> ve;
    for (int i = 0; i < 1000; i++) //120000
    {
        std::shared_ptr<Board::Node> vv = std::make_shared<Board::Node>(std::vector<int>({2, 4, 6, 5, 8, 3, 0, 1, 7}));
        if (ve.size() >= 1)
        {
            vv->down = ve[ve.size() - 1];
            vv->up = ve[ve.size() - 1];
            vv->right = ve[ve.size() - 1];
            vv->left = ve[ve.size() - 1];
            vv->parent = ve[ve.size() - 1];
        }
        ve.push_back(vv);
    }

    return 0;
}

当我更改主文件中的这一行时,会出现这个问题

    for (int i = 0; i < 1000; i++) //120000

对此:

    for (int i = 0; i < 120000; i++) //120000

我得到分割错误,你知道吗?


共1个答案

匿名用户

我想我知道为什么会出现这个问题了。每个fether元素通过shared_ptr拥有上一个元素。因此,当被删除时,第一个元素的析构函数调用第二个元素的析构函数,然后第二个元素的析构函数调用第三个元素的析构函数,依此类推,直到堆栈溢出为止。

要解决此问题,应避免在node类中使用shared_ptr。只需通过原始指针存储到Next/Prev节点的链接,并通过外部代码删除节点(事实上,您有负责存储节点的ve向量)。