[英]“Vector Subscript Out of Range” using std::vector as the value in an std::map
[英]std::deque - subscript out of range
我正在為基於AMX的SA-MP編寫一個插件,並且發生了一個惱人的問題。 我正在使用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所有,以防止內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.