从C ++函数退出时丢失数据

时间:2018-07-01 20:08:47

标签: c++ dictionary

我在使用数据库“地图”时遇到问题。 我正在写一个在图形上实现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'。 当我调试程序时,我注意到当过程提到功能时, 如您所见,几乎要退出该功能的“图形”值 在下面的图片中:

before

但是在功能的最后一步,值会发生变化,如您所见 在这张照片上:

after

如您所见,参数“ second”处的“ key”值更改为“”,而不是“ A”。

谢谢您的帮助。

2 个答案:

答案 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。