문제

atexit () 함수에서 메모리를 자유롭게하는 점이 있습니까?

시작 후 Malloc'ed를 얻는 전역 변수가 있습니다. atexit () 함수를 쓸 수 있도록 atexit () 함수를 쓸 수는 있지만 시스템이 어쨌든 종료 될 때 시스템이 모든 메모리를 되 찾을 수는 없습니까?

깔끔하고 적극적으로 청소하는 데 이점이 있습니까?

도움이 되었습니까?

해결책

C는 아닙니다 - 배가 당신을 가라 앉히는 동안 갑판 의자를 재배치하는 것과 같습니다.

C ++에서는 객체가 파괴자에서 임시 파일 등을 삭제할 수 있으므로 대답은 다르므로 호출해야합니다.

다른 팁

해방에 대한 한 가지 이점은 프로세스의 수명에 걸쳐 거래와 할당을 일치시키려는 메모리 누출 테스트를 수행하면 이런 종류의 고의적 인 누출로 인해 잘못된 긍정을 얻지 못한다는 것입니다.

AS를보고 있습니다 malloc()/free() 일반적으로 사용자 공간에 존재하는 광범위한 데이터 구조가 포함되며 free()프로그램이 종료 될 때 메모리는 실제로 성능 배출량 일 수 있습니다. 데이터 구조의 일부가 디스크에 PAGED 인 경우 디스크에서만로드해야합니다.

당신이없이 종료하는 반면 free()ING, 디스크에 대한 데이터는 평화롭게 죽을 수 있습니다.

물론 free()다른 시간에는 일반적으로 더 유익합니다 malloc()S가 해방 된 공간을 재사용 할 수 있습니다 free() 그런 다음 다른 프로세스에서 사용할 수있는 메모리를 맵핑 할 수도 있습니다.

모든 현대 운영 체제에서 프로그램이 종료 될 때 모든 메모리가 해제 될 것이라고 안전하게 가정 할 수 있습니다.

실제로 깔끔한 것은 프로그램이 진화 할 때 흥미로울 수 있습니다. "초기화"기능을 만들 때 정리 기능을 작성해야합니다. 프로그램이 더욱 복잡해지고 프로그램의 일부를 다시 시작하려는 이점이 발생합니다. 이미 작업 정리 기능을 작성한 경우 프로그램의 일부를 "다시 시작"할 때 갑자기 일부 정리를 잊어 버릴 가능성이 적습니다.

정리 기능 작성 "게으름"즉, 필요할 때만 오류가 발생하기 쉽습니다. 청소 기능을 작성하면 정리 및 최종 청소 종속성에 대해 생각할 수 있습니다. 다른 프로젝트에서 코드의 일부를 더 쉽게 재사용 할 수 있습니다.

따라서 예, Atexit에서 무료는 쓸모가 없으며 파일 디스크립터를 닫습니다. 그러나 코드가 커짐에 따라 정리 기능 작성 및 유지 관리

atexit ()를 호출하는 코드가 동적으로로드 된 공유 라이브러리 (예 : dlopen () 포함)의 일부인 경우 무료 (). 이 경우 atexit 핸들러는 dlclose () 시간에 호출되므로 나머지 프로세스가 사용하기 위해 힙이 계속 존재합니다.

Windows에서 일부 호출은 OS 또는 COM에 속하는 리턴 메모리를 호출하며 해당 메모리를 명시 적으로 자유롭게 해제해야합니다. 그렇지 않으면 프로세스가 종료 된 후에도 해당되지 않습니다. 그러나 이것은 드문 시나리오입니다.

프로세스 종료 전에 메모리를 자유롭게하지 않으면 메모리 누출이 아닙니다. 손잡이를 잃을 때 메모리 누출입니다. 그러나 메모리는 유일한 유형의 리소스가 아니며 다른 리소스 (창 핸들 및 파일 핸들과 같은)에서 기타 리소스가 지속되므로 '무료'가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top