常见面试题 - Linux C++ 基础 - 类对象指针的使用示例

常见面试题 - Linux C++ 基础 - 类对象指针的使用示例,第1张

2. C++ 基础 - 类对象指针的使用示例

重点内容:指向局部变量的指针,在函数执行完成后,就变成了野指针,所指向内容已实效。

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 

重点在这里的乱数据,分析具体原因: 局部变量,指针已释放。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/875823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存