std::d eque - 下标超出范围

std::deque - subscript out of range

本文关键字:范围 下标 eque std      更新时间:2023-10-16

我正在为 SA-MP 编写一个基于 AMX 的插件,并遇到了一个烦人的问题。我正在使用deque和函数来查找和删除元素。(像下面这个)

enum PARAM_TYPE {
    PARAM_TYPE_CELL,
    PARAM_TYPE_ARRAY,
    PARAM_TYPE_STRING,
};
struct params_s {
    enum PARAM_TYPE type;
    struct params_s * next;
    cell free;
    cell numData;
    cell arrayData[0];
};
struct timer_s {
    AMX * amx;
    int id, func, interval, repeat;
    long long unsigned int trigger;
    struct params_s * params;
};
std::deque<struct timer_s *> gTimers;
void DestroyTimer(struct timer_s * t) {
    for (int i = 0; i != gTimers.size(); ++i) {
        if (t == gTimers[i]) {
            gTimers.erase(gTimers.begin() + i);
            break;
        }
    }
}

每当我调用 DestroyTimer() 时,我都会收到此错误:

Debug Assertion Failed!
Expression: deque subscript out of range

我可以添加元素,读取和修改它们,但我不能删除它们。

谢谢。

你应该使用擦除删除习惯用法:

void DestroyTimer(struct timer_s * t)
{
  gTimers.erase(remove(gTimers.begin(), gTimers.end(), t), gTimers.end()); 
}

如果不查看实际错误,惯用方式将是:

gTimers.erase(std::remove(gTimers.begin(), gTimers.end(), t), 
              gTimers.end());

这将比你现在做的更安全、更快(捕获重复,无需重新分配)。

这称为擦除-删除习语。

对于实际的调试断言:调试迭代器是一种标准扩展,在某些情况下可能会损坏。

注意:您希望在计时器上调用delete(如果它归 deque 所有),以防止泄漏内存。