2014-02-27 1 views
0

안녕하세요, 저는 일부 디버깅 개념을 배우고 있습니다. 이 프로그램에서 코어 덤프를 시뮬레이션하려고합니다. 코어가 덤프 될 것으로 기대합니다. 그러나 코어를 생성하지는 않습니다. 프로그램은 문제없이 실행됩니다.무료 포인터 메모리 후 값을 다시 할당 할 수

우선 ptr에 20 바이트를 할당합니다. 새 문자열 하나를 ptr에 복사합니다. 그럼 내가 ptr 무료 ptr 다음 pblm없이 인쇄 작업. 마침내 나는 코어 덤프를 생성 할 수있는 시간을 기대하는 다른 문자열을 할당합니다. 하지만 코어 덤프는 없었어. 누구 pls 왜 코어 덤프를 생성하지 설명 할 수 있습니다. 내가 DBX를 사용하여 실행

int main() 
{ 
    char *ptr; 
    ptr =(char*) malloc (20); 
    strcpy(ptr,"MemoryOperations"); 
    printf("Before Free memory : %s\n",ptr); 
    free(ptr); 
    printf("After Free memory : %s\n",ptr); 
    strcpy(ptr,"MemReassign"); 
    printf("After Re Assigning : %s\n",ptr); 
    return 0; 
} 

같은 코드가 해제 된 후 메모리에 작성하는 경우

(dbx) check -all 
access checking - ON 
memuse checking - ON 
(dbx) run 
Running: a.out 
(process id 19081) 
RTC: Enabling Error Checking... 
RTC: Running program... 
Before Free memory : MemoryOperations 
Read from unallocated (rua): 
Attempting to read 1 byte at address 0x100101a48 
which is 2232 bytes into the heap; no blocks allocated 
stopped in _ndoprnt at 0xffffffff671abbf0 
0xffffffff671abbf0: _ndoprnt+0x1c04: call  _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20 
(dbx) exit 
+1

전화'()'를 중단합니다. –

+0

그 물건과 내가 조사한. 그러나 나는 그 문제를 일으키지 않는 이유를 모른다. – Jeyamaran

+1

C를 쓸 때'malloc'의 반환 값을 캐스팅하지 마십시오. –

답변

1

free (ptr)는 ptr의 값을 수정하지 않습니다. 해당 위치를 재 할당 할 수 있음을 나타냅니다.

A block of memory previously allocated by a call to malloc, calloc or realloc is 
deallocated, making it available again for further allocations. 
Notice that this function does not change the value of ptr itself, 
hence it still points to the same (now invalid) location. 
--cplusplus.com 

따라서 실제로 코어 덤프가 무언가 확인 샷을하려고 미친 듯이 무언가 시도를 생성하려면 : 당신은 코어 덤프를 원하는 경우

char d=10/0; //arithematic 

char *a=malloc(1); 
free(a); 
a=NULL; //this is important after free. 
*a=100; 
+0

코어 덤프를 시뮬레이션하려고하지 않습니다. 나는 그 핵심을 버리지 않는 이유를 알고 싶었습니다. – Jeyamaran

+1

이유는 (위에서 설명한 것처럼) 포인터를 비운 후에도 여전히 동일한 메모리 주소 (프로세스 힙 내에서 현재 프로세스에 액세스 할 수 있음)를 가리 킵니다. 해제하면 내부적으로 재 할당 할 수있는 해당 메모리 위치를 표시합니다. 이는 초기화되지 않은 포인터를 메모리의 어느 곳 으로든 가리킬 수 있기 때문에 (액세스 할 수없는 위치까지도) 포인터를 사용하는 것과는 다릅니다. – Suryavanshi

3

, 아무것도 발생할 수 있습니다. 정의되지 않은 동작입니다. 코어 덤프를 얻을 수 있는지 여부. 메모리가 해제 되었더라도 여전히 프로세스에서 액세스 할 수 있기 때문에 코어 덤프가 발생하지 않습니다. Buf를 사용하여 return 0 문 바로 앞에 다른 malloc을 작성하고 해당 메모리에 쓰면 "After Re Assigning ..."문자열을 덮어 쓸 가능성이 높습니다.

dbx를 사용하면 printf("After Free memory : %s\n",ptr); 문에서 액세스 검사를 활성화했기 때문에 "할당되지 않은 읽기"오류가 발생하지만 dbx가 없으면 액세스 검사가 전혀 수행되지 않습니다. 코어를 시뮬레이션

은 당신이 할 수있는 덤프 :

void main() 
{ 
    char *p = NULL ; 
    *p = 'A' ; 
} 

이 대부분의 플랫폼에서 충돌합니다.