如何解决它的地址在执行过程中会更改为什么?
从输出结果中可以看到,在执行过程中我更改了 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时,将分配一定尺寸的内存。如果在分配的内存足够的情况下向向量添加元素,则地址是相同的(如果内存足够但限制接近,也要注意,执行可能会重新定位整个向量),如果内存不足,所有矢量都重新放置在更大的新内存空间中,并且释放了先前的内存区域。当您从向量中删除元素时,也可能发生这种情况,该元素会自行调整大小以节省内存。
如果新的size()大于Capacity(),则所有迭代器和 引用(包括过去的迭代器)无效。 否则,只有过去的迭代器才无效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。