微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

它的地址在执行过程中会更改为什么?

如何解决它的地址在执行过程中会更改为什么?

输出结果中可以看到,在执行过程中我更改了 this 的地址,我认为我可以利用Pointer比较来实现Tree系统,而无需在内部添加子列表Node和我希望能够比较nodo列表中每个元素的父级以获取更多功能。但主要问题是指针地址的更改,任何人都可以帮助我了解我所缺少的内容

 struct Nodo{
    Nodo* parent=0;
    const char* identity;
    Component* component;
    Nodo()=default;
    Nodo(const char* uid){
        identity=uid;
    }
    Nodo(Nodo* ptr,const char* uid){
        parent=ptr;
        identity=uid;
        std::cout << "\n Address given to " << uid << "  " << ptr <<std::endl;
    }
    void Add(const char* uid,std::vector<Nodo>& objects){
        std::cout << "\n Add call in " << identity << " address sent "<< this <<std::endl;
        objects.emplace_back(Nodo(this,uid));
    }
    void GrapthUI(std::vector<Nodo>& nodes){
        ImGui::PushID(this);
        if(ImGui::TreeNode(identity)){
            ImGui::TreePop();
            ImGui::Indent();
            for(int indx=0; indx<nodes.size(); indx++){
                if(&nodes[indx]!=this){
                    if(nodes[indx].parent==this){
                        nodes[indx].GrapthUI(nodes);
                    }
                }
            }
            ImGui::Unindent();
        }
        ImGui::PopID();
    }
 }

std::vector<Nodo> node;
Main(){//in c++ file.
    node.emplace_back(Nodo("root"));
    node[0].Add("Airplane",node);
    node[0].Add("Ball",node);
    node[1].Add("Car",node);
}

输出

 Add call in [ root ] address sent 0C8FCF88
 Address given to [ Airplane ] 0C8FCF88

 Add call in [ root ] address sent 0C920C68
 Address given to [ Ball ] 0C920C68

 Add call in [ Airplane ] address sent 0C916DE4
 Address given to [ Car ]  0C916DE4

我希望飞机的父指针具有与 Root 相同的地址[ 0C8FCF88 ]但这是不同的。我在这里看到了一个与此名称相似的帖子,但名称相同,但这无济于事,也与我的问题无关。

解决方法

如果将元素添加到向量中,并且结果大小超出其当前容量,则向量需要分配更多的内存。它分配一个新的内存块并将所有现有元素移动到该内存块中,然后添加新元素。然后释放旧的内存块。

如果您希望获得稳定的地址,则可以使用std::vector<std::unique_ptr<Nodo>>

,

这不是问题。这是正常现象。当您开始分配std :: vector时,将分配一定尺寸的内存。如果在分配的内存足够的情况下向向量添加元素,则地址是相同的(如果内存足够但限制接近,也要注意,执行可能会重新定位整个向量),如果内存不足,所有矢量都重新放置在更大的新内存空间中,并且释放了先前的内存区域。当您从向量中删除元素时,也可能发生这种情况,该元素会自行调整大小以节省内存。

正如Cppreference push_back所说:

如果新的size()大于Capacity(),则所有迭代器和 引用(包括过去的迭代器)无效。 否则,只有过去的迭代器才无效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。