c++错误使用迭代器超出引用范围分析与解决
创始人
2025-06-01 08:12:38
0

文章目录

    • 前言
    • 相关错误
    • 错误截图
    • 错误原因
    • 解决方案
    • Visual Studio 更新日志

前言

今天在调用一个URI解析库的时候,在clang的编译器上代码能正常编译,在visual studio就提示迭代器的错误了


相关错误

  1. cannot increment value-initialized string_view iterator
  2. cannot dereference end string_view iterator
  3. cannot increment string_view iterator past end
  4. string iterator not dereferencable" you’ll get "cannot dereference string iterator because it is out of range (e.g. an end iterator)

错误截图


  • 错误代码块


错误原因

if (end_ptr != &*auth_string.end())
{return { authority, uri::Error::InvalidPort, auth_string };
}

end()方法将迭代器返回到最后一个元素之后,指向字符串最后一个字符下一个位置。由于它并不指向实际的字符,因此不能对该迭代器进行解引用操作。

如果想访问最后一个元素,应该使用

  • string.end() - 1 :注意,该语句仅适用于非空字符串,否则将会越界访问
  • string.back()
  • string.at(string.size() - 1)

解决方案

  • 方法1(推荐)
if (--end_ptr != &(auth_string.back()))
{return { authority, uri::Error::InvalidPort, auth_string };
}
  • 方法2
if (--end_ptr != &*--auth_string.end())
{return { authority, uri::Error::InvalidPort, auth_string };
}
  • 方法3
if (--end_ptr != &(auth_string.at(auth_string.size() - 1)))
{return { authority, uri::Error::InvalidPort, auth_string };
}

Visual Studio 更新日志

https://learn.microsoft.com/en-us/cpp/overview/what-s-new-for-cpp-2017?view=msvc-170#visual-studio-2017-rtm-version-150

  • Minor basic_string _ITERATOR_DEBUG_LEVEL != 0 diagnostics improvements. When an IDL check gets tripped in string machinery, it will now report the specific behavior that caused the trip. For example, instead of “string iterator not dereferencable” you’ll get “cannot dereference string iterator because it is out of range (e.g. an end iterator)”.
  • 次要 basic_string_ITERATOR_DEBUG_LEVEL != 0 诊断改进。 当 IDL 检查在字符串机制中失误时,它现在会报告导致失误的特定行为。 例如,现在会收到“无法取消引用字符串迭代器,因为其已超出范围(例如末尾迭代器)”,而不是“字符串迭代器不可取消引用”。

在更新日志中已经告诉了我们错误的原因了

相关内容

热门资讯

男子足浴店消费598元洗脚 被... 大象新闻消息,一男子足浴店消费598元洗脚,事后被女技师告强奸,此案定于2025年6月5日在浙江省乐...
原创 最... 5月份的事情现在才爆出来! 5月20日,湖南一6岁女孩被陌生男子强行拉入小巷子中! 孩子被眼前这一...
越南国会通过法律修正案,取消生... 钛媒体App 6月4日消息,越南国会常务委员会当地时间6月3日下午通过了《人口法令》第十条修正案,该...
商业秘密律师李营营律师分享:原... 最高法院:原告陈述技术秘密内容前后不一,如何处理? 法院无法明确案件审理对象和范围,诉求不明,应驳回...
河北承德丰宁县原县长曾庆鹏已调... 澎湃新闻记者从相关方面获悉,河北省承德市丰宁满族自治县原县长曾庆鹏,已于近日调任承德市隆化县委书记。...
农业板块午盘拉升,政策干预催化... 6月4日,A股震荡攀升,上证指数午盘涨0.43%,深证成指涨0.91%,创业板指涨1.22%。大消费...
《人民日报》刊文:珍酒是贵州最... 5月31日,《人民日报》发布专版文章,聚焦贵州珍酒成立50周年,正向世界一流酿酒企业迈进。文章特别指...
做好涉外法律服务 北上广深各有... 人民日报海外版记者 刘少华 高水平对外开放,离不开法律服务与法治保障。在中国各地,伴随着对外开放的不...
《政务数据共享条例》来了!将带... 国务院3日对外公布《政务数据共享条例》,对政务数据的目录管理、共享使用、平台支撑等工作进行部署。条例...