编译器未完成处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器未完成处理相关的知识,希望对你有一定的参考价值。

我有一个multimap,键是短的,值是另一个multimap。

std::multimap<short,std::multimap<short,short>> multimap

现在我想做了

std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

它编译得很好。但是当我运行它时,它就停止了,没有完成进程,甚至没有抛出任何运行时错误。有什么办法吗?谢谢你的建议。

答案

拥有

std::multimap<short,std::multimap<short,short>> multimap
...
std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

如果 find 返回 multimap::end 那一个不得被减引,但你这样做,并得到一个参考。second的行为是未定义的,当以后使用该引用到 insert.

所以当然要检查是否 find 成绩

  std::multimap<short,std::multimap<short,short>> multimap;
  std::multimap<short,std::multimap<short,short>>::iterator it = multimap.find(0);

  if (it == multimap.end()) {
    ...
  }
  else {
    std::multimap<short,short> &a = it->second;

    std::pair<short,short> z={1,2};
    a.insert(z);
  }

出,你的标题 "编译器没有完成进程 "不是很清楚,执行的不是你所期望的,而是编译器没有运行进程。

另一答案

如果 multimap 没有带键的项目 0那么 multimap.find(0) 返回一个不可dereference的迭代器。在取消引用迭代器之前,一定要检查这种调用的返回值。

auto iter = multimap.find(0);
if ( iter != multimap.end() )
{
   std::multimap<short,short> &a = iter->second;
   std::pair<short,short> z={1,2};
   a.insert(z);
}
else
{
   // Decide what to do
}

以上是关于编译器未完成处理的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 Asynctask 未到达 onPostExecute

Xcode 7 / iOS 9:在 SKNode 中使用 OpenGL 片段着色器未编译

片段着色器中未使用纹理数据 - OpenGL

Xcode:宏破坏完成/突出显示

执行后未处理的异常

代码未进入数据任务的完成处理程序