我在使用数据库“地图”时遇到问题。
我正在写一个在图形上实现BFS(宽度优先搜索)的程序。
在oreder中保留“键”(字符串)和“值”(顶点-我创建的类)
我用:
map<string, Vertex*> graph
“图形”是“图形”类中的一个字段,其中包含一些功能。 功能之一是“ void addv(string&key)”-她的目标是添加一个新的 顶点到地图。这里是该函数的副本:
void Graph::addv(string& key) // add vertex to the graph
{
// initilazited the map by values
string tempKey = key;
Vertex v(tempKey);
v.initialize(tempKey); // at the begining, the color of all vertexes is
//"white".
Vertex * p =&v;
graph.insert(pair<string,Vertex*>(tempKey, &v));
}
在主程序中,我运行此程序:
int main()
{
Graph g;
string v1, v2, e1,e2 ,name;
cout << "enter vertexes" << endl;
cin >> v1;
cin >> v2;
g.addv(v1); g.addv(v2);
}
我的问题是函数的“返回值”。 在运行程序时,我的输入值为:v1 ='A',v2 ='B'。 当我调试程序时,我注意到当过程提到功能时, 如您所见,几乎要退出该功能的“图形”值 在下面的图片中:
但是在功能的最后一步,值会发生变化,如您所见 在这张照片上:
如您所见,参数“ second”处的“ key”值更改为“”,而不是“ A”。
谢谢您的帮助。
答案 0 :(得分:0)
您要插入一个指向具有本地存储持续时间的变量的指针。这些变量的本质是在退出函数并以悬空指针结束时再次进行清理。
要解决此问题,请将该结构复制到映射中(std::map<std::string, Vertex>
,注意所放置的astrisk!)或在堆上创建值(Vertex* v = new Vertex(tempKey);
)。 / p>
答案 1 :(得分:0)
我认为一个问题是,任何addv
调用一旦终止,(在堆栈上)分配的Vertex
就会被销毁,并且其内存将被释放。您可能希望改为在堆上分配它(例如,使用new
,但如今,在这种情况下,“使用new
”应替换为“使用(正确的)智能指针”。 ,可能是您使用std :: make_unique创建的std :: unique_ptr。