글쎄, 이전에 할당하지 않은 메모리를 확보하려고했기 때문에이 시점에서 얻게되는 segfault는 운영 체제에서 사용자에게 권한을 부여하지 않은 메모리 주소를 참조하려고하기 때문에 발생합니다 당신을 (당신은 세분화 결함의 정의입니다) 당신에게.
일부 실험, 당신은 출력으로이 얻을 것이다, 당신은 Valgrind의에서 샘플 코드를 실행 할 말 :
==6945== Invalid free()/delete/delete[]
==6945== at 0x402265C: free (vg_replace_malloc.c:323)
==6945== by 0x80483D5: main (bla.c:6)
==6945== Address 0x7 is not stack'd, malloc'd or (recently) free'd
==6945==
==6945== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6945== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6945== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.
그래서이 'PUR이 노래'메모리 누수입니다. 이제 자유롭게하려고하는 포인터가 할당 한 포인터에 '가까이'있도록 코드를 변경한다고 가정합니다 (운영 체제는 여전히 액세스 권한을 가지고 있으므로 운영 체제는 바이트 경계에 메모리 액세스 권한을 부여하지 않습니다).() (의 malloc의 소유자()과 free) 당신은 이상 (커널에 의해 방출) 세그먼트 오류를 얻을 수 없겠죠이 응용 프로그램 만의 glibc에서 경고를 실행하는 경우
int main(){
int* c;
c = (int*)malloc(sizeof(int));
c++;
free(c);
return 0;
}
: 우리는이 같은 코드를 수정 말
[email protected]:/tmp$ ./a.out
*** glibc detected *** ./a.out: free(): invalid pointer: 0x0804a00c ***
... followed by a trace
그래서 당신은 커널이 당신에 속하는 알고있는 일부 메모리를 확보하기 위해 노력하고 있지만, 그 중 glibc는 당신에게 나눠주고 기억할 수 없습니다.
==6955== Invalid free()/delete/delete[]
==6955== at 0x402265C: free (vg_replace_malloc.c:323)
==6955== by 0x80483D2: main (bla.c:5)
==6955== Address 0x418a02c is 0 bytes after a block of size 4 alloc'd
==6955== at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==6955== by 0x80483C0: main (bla.c:3)
==6955==
==6955== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
==6955== malloc/free: in use at exit: 4 bytes in 1 blocks.
==6955== malloc/free: 1 allocs, 1 frees, 4 bytes allocated.
: 당신은 당신이 출력을 얻을 것이다 (libc의()의 malloc(), realloc을(), ... 기능을 무료로 교체 자체에 회계를 수행하여 작동하는) Valgrind의이 실행한다면 전통적인 Unix 가비지 수집 방식 : 프로그램을 실행하고 종료 될 때 메모리를 회수합니다. IDE, 브라우저 및 오랫동안 실행될 가능성이있는 다른 프로그램에서는 잘 작동하지 않습니다. –