首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::deque -下标超出范围

std::deque -下标超出范围
EN

Stack Overflow用户
提问于 2012-10-15 20:53:34
回答 2查看 2K关注 0票数 1

我正在为SA-MP写一个插件,基于AMX,并发生了一个恼人的问题。我正在使用一个双队列和一个函数来查找和删除一个元素。(如下图所示)

代码语言:javascript
复制
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()时,我都会得到这个错误:

代码语言:javascript
复制
Debug Assertion Failed!
Expression: deque subscript out of range

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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-10-15 21:01:03

您应该使用erase remove idiom

代码语言:javascript
复制
void DestroyTimer(struct timer_s * t)
{
  gTimers.erase(remove(gTimers.begin(), gTimers.end(), t), gTimers.end()); 
}
票数 2
EN

Stack Overflow用户

发布于 2012-10-15 21:01:20

在不考虑实际错误的情况下,惯用的方法是:

代码语言:javascript
复制
gTimers.erase(std::remove(gTimers.begin(), gTimers.end(), t), 
              gTimers.end());

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

这称为Erase-Remove idiom

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

注意:你想在计时器上调用delete,如果计时器属于deque,以防止内存泄漏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12896069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档