나는 프로그램에서 segfault 때문에 valgrind를 실행했습니다. 알아낼 수 없기 때문입니다. 그것은 여기에 문제가 ...std :: list는 포인터에서 호출 삭제를 제거합니까?
Address 0x75c7670 is 0 bytes inside a block of size 12 free'd
at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
by 0x805F6D8: std::list<Object*, std::allocator<Object*>::remove(O
bject* const&) (new_allocator.h:95)
제거는이 방법에 ...
void ObjectManager::AdjustGridCoord(int x, int y, Object* const obj) {
// GetTileX and GetTileY guaranteed to be valid indices
int newX = ObjectAttorney::GetTileX(obj);
int newY = ObjectAttorney::GetTileY(obj);
if (x != newX || y != newY ) {
m_objGrid[x][y].remove(obj);
m_objGrid[newX][newY].push_back(obj);
}
}
나는 그것에 delete
을 부를 것이다 목록에서 포인터를 제거 생각하지 않았다를 발견했습니다. 여기에 의심되는 것? 더 많은 정보가 필요하시면 알려주십시오.
P. 이전에 이것을 디버깅 할 때 GetTileX 및 GetTileY 은 유효한 인덱스가 아니기 때문에이 유효하고 13775864와 같은 말도 안되는 숫자를 반환하기 때문에 문제가 발생했음을 알았습니다.이 문제는 delete
문제와 관련이 있다고 생각하며 제거 또는 push_back이 문제의 원인입니다. .
편집 : 여기에 다른 코드가
for (unsigned int x = 0; x < m_objGrid.size(); ++x) {
for (unsigned int y = 0; y < m_objGrid[x].size(); ++y) {
for (ListItr obj = m_objGrid[x][y].begin(); obj != m_objGrid[x][y].end(); ++obj) {
ObjectAttorney::UpdateAI(*obj);
AdjustGridCoord(x, y, *obj);
}
}
}
스 니펫 반복자를 무효화 할 수 AdjustGridCoord 수있다?
'가정'은 ** 모든 위험한 **입니다. _ "목록에서 포인터를 지우면 delete가 호출 될 것이라고 생각하지 않았습니다."_ _ 항상 오류 처리 방법을 시도하는 것보다 실제로 무엇을하는지 배우는 것을 선호합니다. –
그것은 정말로 가정이 아니 었습니다. 목록에서 무언가를 제거하면 객체의 소멸자가 호출되고 포인터가없는 경우에는 사실이 아닌가? – lotad
오른쪽 포인터는'delete' 연산을 수행하지 않습니다. 이 오류는 목록에 없지만 어딘가에서 사용할 수 있습니다. – GManNickG