2012-10-15 47 views
1

我正在为SA-MP编写一个插件,基于AMX,并且出现了一个烦人的问题。我正在使用一个deque和一个函数来查找&删除一个元素。 (像下面这样)std :: 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 

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

谢谢。

+2

你在做什么似乎完全复杂的东西这么简单。 'std :: find' +'deque :: erase'或者更好的Erase-Remove Idiom有什么问题?另外,你确定你不需要调用'delete'吗? – pmr

回答

1

您应该使用erase remove idiom

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

不看实际的错误,惯用的方法是:

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

这将是比你现在在做什么,安全和快捷(捕获 重复,无需重新分配)。

这被称为Erase-Remove idiom

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

注意:如果定时器拥有deque,您希望调用delete以防止内存泄漏。

+0

是的,实际上我打电话删除那个计时器,它是参数,但是,我删除了那段代码,因为它与我的错误无关。 – user1747071