2011-09-01 2 views
2

내 프로그램을 실행할 때 가끔 충돌이 저에게이 오류 줄 것이다 : 는 ":) (무료 : 의 glibc가 pathtoexecutable/감지 (빠른) 유효하지 않은 다음 크기는"vector.push_back에서 "glibc free() : 다음 크기가 유효하지 않습니다 (빠름)"?

역 추적은 멤버 함수로 연결 단지는 벡터의와 push_back 함수를 호출하는 - 나는 오류 및 문제의 매우 큰 대부분을 인터넷 검색을 시도

void Path::add(Position p) {path.push_back(p);} 

너무 적은 메모리를 할당하는 사람들이 있습니다. 그렇다면 어떻게하면 표준에서 일어날 수 있겠습니까? <> .push_back? 무엇을 확인할 수 있습니까? 어떤 도움을 주셔서 감사합니다.

답변

8

어딘가에서 쓸모가 없거나 glibc에 의해 보관 된 제어 정보를 trashing하고있을 것입니다. 따라서, 물건을 해방하려고 할 때 비정상적인 조건 (자유롭지 않은 크기)을 감지합니다.

이런 종류의 문제에 대해 가장 나쁜 점은 실제 실수를 한 시점에서 문제가 나타나지 않으므로 잡기가 매우 어려울 수 있다는 것입니다. (별로 벗어나는 오류가있는 것이 일반적입니다.).

가장 좋은 방법은 메모리 디버거를 사용하는 것입니다. valgrind이 시작일 수 있습니다 (glibc에 대해 언급 했으므로). glibc 메시지 앞에 "size of invalid write"가 있는지 확인하십시오.

+2

valgrind is awesome –

2

@cniculat가 말한대로 valgrind를 시도하십시오. 당신이 시도 할 수

또 다른 도구는 다음과 같습니다

  • GCC STL과 디버깅을 지원합니다. STL 컨테이너의 잘못된 사용에 문제가있는 경우 D_GLIBCXX_DEBUG 및 -D_GLIBCXX_DEBUG_PEDANTIC으로 컴파일하면 문제가 발생할 수 있습니다. 문제가 발견 된 경우 프로그램은 assert()에 의해 중단되므로 콘솔에 오류 메시지가 표시됩니다.
  • 또 다른 옵션은 google tcmalloc을 사용하는 것입니다. 이 값은 malloc()/free()보다 우선합니다. tcmalloc 링크 버전으로 appl를 연결하면 미스트 메모리 사용 문제를 감지 할 수 있습니다.

STL 디버그 지원 및 tcmalloc는 디버그 빌드에서 정기적으로 사용할 수 있습니다. 이 방법을 사용하면 정규로 작업 할 수 있지만 오류가있는 경우 "백그라운드"에있는 도구를 통해 사용자를 단정 할 수 있습니다.

+0

감사합니다. 매크로가 도움이되었습니다. :) – AkiRoss

관련 문제