栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号