繁体   English   中英

std:map迭代器在查找时返回badptr

[英]std:map iterator returns badptr on find

我将我的std::map定义为

typedef std::map<string,ImageData*> ImageDataMap;
typedef std::pair<string,ImageData*> ImageDataPair;
typedef std::map<string,ImageData*>::iterator ImageDataIterator;

上面的地图存储作为图像文件名的字符串和作为图像元数据的ImageData 当我使用如下所示的查找时

ImageDataIterator iter =  imageMap->find("Fader.tga");
if(iter == imageMap->end()){...}

iter- iter->first是badptr,因此如果满足以下if条件,它将失败。 怎么了 在xp64上的vc9 Express Edition上运行(程序为32位)

map::find()返回为map::end的迭代器意味着在容器中找不到指定的键。 您不能取消引用它以访问其元素。 它将使您的应用程序崩溃。

编辑:

让我们清楚一点。 问题是您在颠倒逻辑,好吗? 您只能使用有效的迭代器,因此iter必须与map::end不同。 这意味着map::find()成功并找到了您要查找的元素:

if (iter != imageMap->end())
{
  // element FOUND! Use it!
  cout << iter->first << endl;
}
else
{
  // Not found! Can't use it.
}

您的错误是您当前正在执行的if比较: if (iter == imageMap->end()) ,这意味着如果我搜索的元素不在地图中 ,请执行以下代码块 这就是为什么在执行iter->first时,应用程序会中断。

#include <iostream>
#include <map>
#include <string>

typedef int ImageData;
typedef std::map<std::string,ImageData*> ImageDataMap;
typedef std::map<std::string,ImageData*>::iterator ImageDataIterator;


using namespace std;


int main()
{
  ImageDataMap mymap;

  int value_1 = 10;
  int value_2 = 20;
  int value_3 = 30;

  mymap["a"] = &value_1;
  mymap["b"] = &value_2;
  mymap["c"] = &value_3;

  // Search/print valid element
  ImageDataIterator it = mymap.find("a");
  if (it != mymap.end()) // will execute the block if it finds "a"
  {          
      cout << it->first << " ==> " << *(it->second) << endl;
  }

  // Searching for invalid element
  it = mymap.find("d"); // // will only execute the block if it doesn't find "d"
  if (it == mymap.end())
  {
    cout << "!!! Not found !!!" << endl;
    cout << "This statement will crash the app" << it->first << endl;;
  }

  cout << "Bye bye" << endl;

  return 0;
}

也许您应该将if(iter == imageMap->end()){...}更改为if(iter != imageMap->end()){...}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM