【问题标题】:shared_ptr is empty out of functionshared_ptr 没有功能
【发布时间】:2020-11-04 10:42:30
【问题描述】:

我尝试动态创建可能具有无法访问节点的图形。这些节点将在创建时转换为新图。然后我将所有图表保存在 的地图中。

MaterialArch 是一个图表

MatArchNode 是一个节点

主图的创建:

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);
        }
    }
}

我将图表放入地图的功能:

void MaterialPop::add(std::string name, std::shared_ptr<MaterialArch> mat){
    std::cout << "ADD : "<<name << std::endl;
    bool alreadyExist = false;
    for (auto var : m_varMaterials) {
        if(var.second == mat){
            alreadyExist = true;
        }
    }
    if(!alreadyExist){
        m_console->addMatName(name);
        m_varMaterials.emplace(name,std::move(mat)); 
        m_views.emplace(name, std::make_shared<MaterialArchView>(m_varMaterials.at(name)));
        m_visibility.emplace(name,true);
    }
}

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

提前感谢您的帮助

【问题讨论】:

标签: c++ shared-ptr


【解决方案1】:

对不起,我太糟糕了,我的 setRoot() 看起来像:

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

所以没有设置根,因为节点总是无法访问

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2014-11-09
    • 2014-08-30
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多