2011-09-01 3 views
9

다음 코드를 감안할 때 : 위의 코드를 컴파일 및 실행Ctrl-C를 사용하여 프로그램이 중단 될 때 동적으로 할당 된 공간이 어떻게 해제됩니까?

#include <stdio.h> 

int main() 
{ 
    int *p; 
    p = (int *)malloc(10 * sizeof(int)); 

    while(1); 
    return 0; 
} 

을하고 Ctrl + C를 눌러 동안 실행에 중단, 어떻게 p에 할당 된 메모리가 해제된다? 운영 체제의 역할은 무엇입니까? 그리고 C++의 경우와 어떻게 다른가요? new 연산자를 사용 했습니까?

+7

운영 체제는 프로세스 종료시 모든 프로세스를 종료합니다. –

+0

'Ctrl + C '의 특별한 점은 무엇입니까? –

+0

어떻게 OS가 메모리를 회수합니까 ?? 보다 구체적으로, OS의 어떤 구성 요소가 그 일을 담당합니까 ?? – 4sh1sh

답변

13

프로세스가 종료되면 운영 체제는 프로세스가 사용하고 있던 모든 메모리를 회수합니다.

OS가 종료 할 때 사용중인 메모리를 OS가 회수 할 때도 사람들이 메모리 누출을 크게 막히는 이유는 대개 사소한 응용 프로그램이 오랫동안 모든 메모리를 천천히 움직이게하기 때문입니다 시스템. 매우 짧은 수명의 프로그램에서는 문제가 적습니다. (. 한 라이너가 큰 프로그램이 될 것이다, 그래서 작은 프로그램에서도 어떤 메모리 누수가없는 때 당신이 말할 수 없다) 그런데

+0

OS가 프로세스가 사용중인 메모리를 어떻게 회수하는지 더 자세히 설명 할 수 있습니까? 운영 체제에 대해 이렇게 어떤 특정 프로세스 ?? – 4sh1sh

+0

@ 4sh1sh 각 프로그램은 자체 스택과 무료 저장소 (힙)를 가져옵니다. 프로그램이'new' /'delete'를 호출하면 free store를 사용하기 시작합니다.프로그램이 종료되면 OS는 스택과 그 밖의 모든 것을 포함하여 모든 메모리를 회수합니다. 자유 저장소에있는 어떤 특정 메모리 블록이 사용되었는지 관심 없다 (예 :'new'd 또는'delete'd 등). 그것은 단지 모든 것을 되 찾는다. –

+0

OS에 특정 프로세스가 있습니까? 특히 UNIX에서이 작업을 수행합니까? – 4sh1sh

3

을 (세스 카네기에 추가했다) :

<signal.h>에서 루틴을 사용

예를 따라서 손실을 방지 닫는 파일처럼 (뿐만 아니라 메모리를 중요한 자원을 청소하기 위해 당신은 어떤 식 으로든 Ctrl 키 + C을 처리 할 수있는 SIGINT 신호 (인터럽트)를 잡을 수 있습니다 버퍼링되고 아직 작성되지 않은 콘텐츠 또는 네트워크 연결을 부드럽게 닫음).

0

메모리가 실제로 "free()"되지 않습니다.

운영 체제에서 얻은 메모리는 페이지 크기 (일반적으로 4KB의 메모리)입니다. 프로세스가 메모리를 다 써 버릴 때마다 추가 페이지를 얻습니다. 이것은 malloc()이 실제로 사용하는 공간입니다. 프로세스가 종료되면 모든 페이지가 운영 체제로 리턴되어 free를 실제로 불필요하게 만듭니다. 프로그램이 서버 또는 유사하다면 결코 해제되지 않는 모든 메모리 조각은 프로그램이 실제로 죽을 때만 반환되어 더 많은 메모리를 필요로하게 만듭니다.

관련 문제