简单,可复制

点点滴滴,尽在文中

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  431 随笔 :: 0 文章 :: 617 评论 :: 1546万 阅读

STL好用是好用, 不慎的话相当危险, 尤其是俺们这些服务器程序. 
    迭代器失效就不说了, 发生了就是个当机回档的事, 慎之!


    最近工作中看到了stl::sort排序导致的一个core, 问题的根源就是, stl::sort要求被排序的对象必须是顺序确定的, 比如你在重载<操作符的时候

class Test1 
{
int a;
bool operator < (const Test1& rhs) {
return this->a < rhs.a;
}
};

    上面的代码就是没问题的, 因为两个给定的Test1对象, 调用<的时候的结果是一致的.但是如果是下面这样

class Test2 
{
int a, b;
bool operator < (const Test1& rhs) {
return this->a < rhs.a || this->b < rhs.b;
}
};

那么, 对于obj1(a = 1, b = 4)和obj2(a = 2, b = 3)来说, obj1 < obj2的结果是真, 而obj2 < obj1的结果也是真, 这样, stl::sort就会出错。

又或者是:

class Test2 
{
int a, b;
bool operator < (const Test1& rhs) {
bool ret = this->a < rhs.a;
return !ret;//降序排序
}
};

当排序的序列中,如果有两个Test类的a一样大,就会出错。

    主要的原因是在stl::sort的内部, 由于这种无法判断两个元素大小的问题, 导致迭代器失效. 这次不是因为用户erase让其失效的, 而是因为没有遵守stl::sort的前置条件, 而导致的内部迭代器失效, 比平常发生的失效更加的隐藏. 
     可能看到这个错误会觉得怎么可能写出这种逻辑呢, 但是有时候在实现业务逻辑的时候, 就是很难发现这样的和程序内建必要条件相矛盾的地方, 从而产生错误.

参考:http://shaohui.me/archives/140

posted on   ggjucheng  阅读(3287)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示