编译器未完成处理
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