shared_ptr是空的功能

问题描述

我尝试动态创建可能具有不可达节点的图。这些节点将在创建时转换为新图。然后,将所有图形保存在的映射中。

MaterialArch是图形

MatArchNode是一个节点

创建主图:

const client = new MongoClient('mongodb://admin:admin@localhost:30000');
await client.connect();
db = client.db('data');

generate函数,将不可达的节点转换为图:

void Console::newMaterial(std::string name,int size){
    if(!isVariable(name)){
        if(!inMaterial(name)){
            std::shared_ptr<MaterialArch> mat = std::make_shared<MaterialArch>(m_matPop.get());
            mat->generate(size);
            m_matPop->add(name,mat);
        }
    }
    else{
        print("Error : Material name already used");
    }
}

我将图形放在地图中的函数

void MaterialArch::generate(int nbNodes){
    std::vector<std::shared_ptr<MatArchNode>> nodeList;
    if(m_root == nullptr){
        m_root = std::make_shared<MatArchNode>();
        m_root->generate();
        nodeList.push_back(m_root);
        for (int i = 1; i < nbNodes; ++i) {
            std::shared_ptr<MatArchNode> nextNode = std::make_shared<MatArchNode>();
            nextNode->generate();
            nodeList.push_back(nextNode);
        }
        if(nodeList.size() < 2){
            return;
        }
        for (auto node : nodeList) {
            //linking
        }
    }
    std::vector<std::shared_ptr<MatArchNode>> newRoots;
    for (auto node : nodeList) {
        bool unreachable = true;
        if(!node->orpheline(m_root)){
                unreachable = false;
        }
        for (auto root : newRoots) {
            if(!node->orpheline(root)){
                unreachable = false;
            }
        }
        if(unreachable){
            std::cout << "@ORPH" << std::endl;
            std::shared_ptr<MaterialArch> orph = std::make_shared<MaterialArch>(m_matPop.get());
            orph->setRoot(node);
            m_pop->add(m_pop->orphName(),orph);
            newRoots.push_back(node);
        }
    }
}

我的问题是,一旦我脱离了generate(),每个orph shared_ptr都是空的。我以为是因为我尝试访问已删除的对象,但是在函数中以相同的方式创建了主图,并且主图不是空的。

预先感谢您的帮助

解决方法

对不起,我很糟糕,我的setRoot()看起来像这样:

if(!orpheline(node)){
   m_root = node;
}

因此未设置根目录,因为节点始终不可访问