我正在为SA-MP写一个插件,基于AMX,并发生了一个恼人的问题。我正在使用一个双队列和一个函数来查找和删除一个元素。(如下图所示)
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我可以添加元素,读取和修改它们,但不能删除它们。
谢谢。
发布于 2012-10-15 21:01:03
您应该使用erase remove idiom
void DestroyTimer(struct timer_s * t)
{
gTimers.erase(remove(gTimers.begin(), gTimers.end(), t), gTimers.end());
}发布于 2012-10-15 21:01:20
在不考虑实际错误的情况下,惯用的方法是:
gTimers.erase(std::remove(gTimers.begin(), gTimers.end(), t),
gTimers.end());这将比您现在所做的更安全、更快(捕获重复项,无需重新分配)。
这称为Erase-Remove idiom。
对于实际的调试断言:调试迭代器是一个标准扩展,在某些情况下可能会中断。
注意:你想在计时器上调用delete,如果计时器属于deque,以防止内存泄漏。
https://stackoverflow.com/questions/12896069
复制相似问题