簡體   English   中英

std :: deque - 下標超出范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM