重点内容:指向局部变量的指针,在函数执行完成后,就变成了野指针,所指向内容已实效。
struct WtsOsmNode
{
int Id;
};
struct WtsOsmWay
{
int Id;
std::vector vectorNodesOfWay; //重点
};
struct WtsOsmFile
{
std::map mapNodes;
std::map mapWays;
};
class WtsOsmFileManager
{
public:
void TestExample()
{
stOsmFile1_ = CreateNewWtsOsmFile1();
stOsmFile3_ = CreateNewWtsOsmFile3();
printf("stOsmFile1_ info as following: n");
PrintNodesInfo(stOsmFile1_);
PrintWaysInfo(stOsmFile1_);
printf("n");
printf("stOsmFile3_ info as following: n");
PrintNodesInfo(stOsmFile3_);
PrintWaysInfo(stOsmFile3_);
printf("n");
}
private:
WtsOsmFile CreateNewWtsOsmFile1()
{
//WtsOsmFile stOsmFile;
WtsOsmNode stNode1;
stNode1.Id = 31;
stOsmFile1_.mapNodes[stNode1.Id] = stNode1;
WtsOsmNode stNode2;
stNode2.Id = 32;
stOsmFile1_.mapNodes[stNode2.Id] = stNode2;
WtsOsmWay stWay1;
stWay1.Id = 101;
stWay1.vectorNodesOfWay.push_back(&stNode1);
stWay1.vectorNodesOfWay.push_back(&stNode2);
stOsmFile1_.mapWays[stWay1.Id] = stWay1;
printf("stOsmFile1_ temp info as following: n");
PrintNodesInfo(stOsmFile1_);
PrintWaysInfo(stOsmFile1_);
printf("n");
return stOsmFile1_;
}
WtsOsmFile CreateNewWtsOsmFile2()
{
WtsOsmFile stOsmFile;
WtsOsmNode stNode3;
stNode3.Id = 33;
stOsmFile.mapNodes[stNode3.Id] = stNode3;
WtsOsmNode stNode4;
stNode4.Id = 34;
stOsmFile.mapNodes[stNode4.Id] = stNode4;
WtsOsmWay stWay2;
stWay2.Id = 102;
stWay2.vectorNodesOfWay.push_back(&stNode3);
stWay2.vectorNodesOfWay.push_back(&stNode4);
stOsmFile.mapWays[stWay2.Id] = stWay2;
printf("stOsmFile2_ temp info as following: n");
PrintNodesInfo(stOsmFile);
PrintWaysInfo(stOsmFile);
printf("n");
return stOsmFile;
}
WtsOsmFile CreateNewWtsOsmFile3()
{
WtsOsmFile stOsmFile2 = CreateNewWtsOsmFile2();
WtsOsmFile stOsmFile3;
stOsmFile3.mapNodes = std::move(stOsmFile2.mapNodes);
stOsmFile3.mapWays = std::move(stOsmFile2.mapWays);
printf("stOsmFile3 temp info as following: n");
PrintNodesInfo(stOsmFile3);
PrintWaysInfo(stOsmFile3);
printf("n");
return stOsmFile3;
}
void PrintNodesInfo(WtsOsmFile osmFile)
{
int iIndex = 0, iTotalCount = osmFile.mapNodes.size();
printf("osmFile.mapNodes.size = %ld n", osmFile.mapNodes.size());
for(std::map::iterator item = osmFile.mapNodes.begin(); item!= osmFile.mapNodes.end(); item++)
{
printf("mapNodes[%d/%d]->id = %d n", iIndex, iTotalCount, item->second.Id);
iIndex++;
}
}
void PrintWaysInfo(WtsOsmFile osmFile)
{
int iIndex = 0, iTotalCount = osmFile.mapWays.size();
printf("osmFile.mapWays.size = %ld n", osmFile.mapWays.size());
for(std::map::iterator item = osmFile.mapWays.begin(); item!= osmFile.mapWays.end(); item++)
{
printf("map_ways[%d/%d]->id = %d n", iIndex, iTotalCount, item->second.Id);
int iIndexOfNodes = 0, iTotalCountOfNodes = item->second.vectorNodesOfWay.size();
printf("map_ways[%d/%d].Nodes.size() = %d n", iIndex, iTotalCount, iTotalCountOfNodes);
for(iIndexOfNodes = 0; iIndexOfNodes < iTotalCountOfNodes; iIndexOfNodes++)
{
printf("map_ways[%d/%d].Nodes[[%d/%d] = %d n",
iIndex, iTotalCount, iIndexOfNodes, iTotalCountOfNodes, item->second.vectorNodesOfWay[iIndexOfNodes]->Id);
}
iIndex++;
}
}
private:
WtsOsmFile stOsmFile1_;
WtsOsmFile stOsmFile3_;
};
int main(int argc, char **argv)
{
WtsOsmFileManager exampleTest;
exampleTest.TestExample();
}
运行结果:
stOsmFile1_ temp info as following: osmFile.mapNodes.size = 2 mapNodes[0/2]->id = 31 mapNodes[1/2]->id = 32 osmFile.mapWays.size = 1 map_ways[0/1]->id = 101 map_ways[0/1].Nodes.size() = 2 map_ways[0/1].Nodes[[0/2] = 31 map_ways[0/1].Nodes[[1/2] = 32
stOsmFile2_ temp info as following: osmFile.mapNodes.size = 2 mapNodes[0/2]->id = 33 mapNodes[1/2]->id = 34 osmFile.mapWays.size = 1 map_ways[0/1]->id = 102 map_ways[0/1].Nodes.size() = 2 map_ways[0/1].Nodes[[0/2] = 33 map_ways[0/1].Nodes[[1/2] = 34
stOsmFile3 temp info as following: osmFile.mapNodes.size = 2 mapNodes[0/2]->id = 33 mapNodes[1/2]->id = 34 osmFile.mapWays.size = 1 map_ways[0/1]->id = 102 map_ways[0/1].Nodes.size() = 2 map_ways[0/1].Nodes[[0/2] = -911812540 map_ways[0/1].Nodes[[1/2] = 21865
stOsmFile1_ info as following: osmFile.mapNodes.size = 2 mapNodes[0/2]->id = 31 mapNodes[1/2]->id = 32 osmFile.mapWays.size = 1 map_ways[0/1]->id = 101 map_ways[0/1].Nodes.size() = 2 map_ways[0/1].Nodes[[0/2] = -911812540 map_ways[0/1].Nodes[[1/2] = 21865
stOsmFile3_ info as following: osmFile.mapNodes.size = 2 mapNodes[0/2]->id = 33 mapNodes[1/2]->id = 34 osmFile.mapWays.size = 1 map_ways[0/1]->id = 102 map_ways[0/1].Nodes.size() = 2 map_ways[0/1].Nodes[[0/2] = -1116505008 map_ways[0/1].Nodes[[1/2] = 32767
重点在这里的乱数据,分析具体原因: 局部变量,指针已释放。



