2012-10-15 3 views
1

AMX를 기반으로 SA-MP 용 플러그인을 작성 중이며 성가신 문제가 발생했습니다. deque 및 함수를 사용하여 & 요소를 삭제하려고합니다. (아래이 같은)std :: deque - subscript out of range

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이라고합니다.

실제 디버그 어설 션의 경우 디버깅 반복기는 표준 확장이며 일부 경우에는 손상되었을 수 있습니다.

NB : 메모리 누수를 방지하기 위해 타이머에 delete (소유주가있는 경우)으로 전화를 걸려고합니다.

+0

그래, 사실 나는 그 타이머에서 delete를 호출하고 매개 변수이지만, 내 오류에 관련이 없기 때문에 그 코드를 삭제했다. – user1747071