You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++11中Vector分配引发SIGABRT错误问题求助

问题分析与修复

错误根源

你的sortQueue函数存在两个核心问题,直接触发了内存错误:

  1. 重复插入同一元素:for循环中持续调用orders.back()且未移除该元素,循环orders.size()次会将vector的最后一个元素重复插入队列,造成队列元素数量远超预期,破坏了队列的内存管理逻辑,进而引发free(): invalid pointer。
  2. 入队顺序逻辑错误:排序后的vector是升序,但原代码没有按遍历顺序入队,完全不符合优先队列排序后重新入队的预期。

此外需额外检查:

  • deQueue()函数是否正确更新front变量,确保循环能正常终止,且队列内部状态一致。
  • Queue::enQueue()的实现是否存在内存操作漏洞,比如非法指针访问、越界操作等。

修复后的代码

void sortQueue() {
    std::vector<double> orders;
    // 将队列元素全部导出到vector
    while (front != -1) {
        orders.push_back(this->deQueue());
    }
    // 按升序排序元素
    sort(orders.begin(), orders.end(), [](double o1, double o2) { return o1 < o2; });
    // 遍历排序后的vector,逐个重新入队
    // 若需要优先队列保持大元素优先,可改用反向遍历(rbegin/rend)
    for (const auto& val : orders) {
        this->Queue::enQueue(val);
    }
}

补充说明

  • 如果你的优先队列需要实现大顶堆(大元素优先级高),将入队循环改为反向遍历即可:
    for (auto it = orders.rbegin(); it != orders.rend(); ++it) {
        this->Queue::enQueue(*it);
    }
    
  • 务必确保deQueue()在每次出队后正确维护front和队列的内部状态,避免出现空队列后front未被重置为-1的情况。

内容的提问来源于stack exchange,提问作者rotroq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:25:48