2011-10-14 1 views
0

먼저, 여기에 메시지 Valgrind의 날 (이, 내가 같은 메시지를 여러 번 한 오류 얻을 수있다)Valgrind의 오류 : 크기 4의 무효 쓰기 (그러나 오류에 말한다() 무료)

==25248== Invalid write of size 4 
==25248== at 0x4024B3A: free (vg_replace_malloc.c:366) 
==25248== by 0x8048F5E: sthread_free_ctx (sthread_ctx.c:86) 
==25248== by 0x80489C1: sthread_user_exit (sthread_user.c:105) 
==25248== by 0x804883C: dispatcher (sthread_user.c:40) 
==25248== Address 0x41a6148 is 65,376 bytes inside a block of size 65,536 free'd 
==25248== at 0x4024B3A: free (vg_replace_malloc.c:366) 
==25248== by 0x8048F5E: sthread_free_ctx (sthread_ctx.c:86) 
==25248== by 0x80489C1: sthread_user_exit (sthread_user.c:105) 
==25248== by 0x804883C: dispatcher (sthread_user.c:40) 
준다

malloc 충분한 공간이 없을 때이 오류가 발생하는 데 익숙해 져서 이해가 안됩니다. 그래서 무언가를 자유롭게하려고 할 때 오류가 발생하는 이유는 무엇입니까 ?? 무엇이 쓰여지고 있는가?

감사

+0

그것은 무엇이 잘못되었는지 알려줍니다. 주소 0x41a6148은 65,536 바이트 크기의 블록 안에 65,376 바이트입니다. 당신은 (틀림없이) 유효하지 않은 포인터를 해제합니다. – user786653

+0

관련 코드 줄을 게시하십시오. – BlackJack

답변

3

너무 작은 정보를 얘기하기가 어렵다 (특히 : 없음 코드)하지만 당신처럼 나에게 보인다는 메모리 영역에의 오프셋 (offset)을 참조하는 포인터에 free 전화를 시도 할 수있다 이미 free에 대한 이전 전화로 해방되었습니다. free은 힙 데이터 구조를 조작해야하므로 메모리 영역에 쓰려고 시도하는 것이 놀랄 일이 아닙니다.

+0

오케이, 그건 의미가 있습니다! valgrind는 줄을 제거 할 때 (sthread_free_ctx()) 줄 때 메모리 누수가 없으므로 문맥이 다음 번에 free'd라고 가정 할 것입니다. 감사합니다! – Toadums