programing

종료하기 전에 메모리를 확보해야 합니까?

bestprogram 2023. 6. 6. 10:24

종료하기 전에 메모리를 확보해야 합니까?

오류로 인해 프로그램을 종료할 때 모든 mallocated 메모리를 해제해야 합니까?

something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
    something[i] = (char*) malloc (y + 1);

...

if (anything == NULL) {
   printf("Your input is wrong!");
   // should I free memory of every mallocated entity now?
   exit(1);
} 
else {
   // work with mallocated entities
   ...
   free(something); // it must be here
   system("pause);
}

이것은 사실 정말 어렵고, 헤아릴 수 없는 질문입니다.

Pro(종료 전에 모든 것을 해제하는 것에 찬성):

  • 코드를 다시 정렬하면 나중에 버그나 메모리 누수가 없음
  • Valgrind 또는 메모리 누출 검사기에서 잘못된 양성 반응
  • 버그가 많은 OS에서 실행 중이거나 OS가 전혀 없는 경우 메모리 누수 없음

Con(그냥 종료하면 모든 것을 해방시킬 수 있습니다.):

  • 모든 것을 자유롭게 하는 것은 많은 일이 될 수 있습니다.
  • 모든 것을 자유롭게 하는 것은 버그와 충돌을 야기할 수 있습니다.
  • 종료 시 OS에서 모든 리소스를 회수해야 합니다.

그리고 한 가지 더 말씀드리겠습니다. (찬성인지 반대인지 확실하지 않습니다.) 대부분의 시스템에서, 전화를 겁니다.free메모리를 운영 체제에 반환하지 않습니다(종료만 해당).

결국, 여러분은 이러한 장단점 중 어느 것이 여러분에게 가장 중요한지 결정해야 할 것입니다.서로 다른 상황에서 서로 다른 프로젝트에 참여하는 프로그래머들은 서로 다른 결론에 도달할 것입니다. 여기에는 획일적인 대답이 없습니다.

이전 스택 오버플로 문제도 참조하십시오.C FAQ 목록의 질문 7.24를 참조하십시오.

종료하기 전에 항상 할당된 메모리를 확보해야 합니다.다른 답변에서 이미 언급했듯이 정적 또는 동적 분석 도구 등의 경고를 최소화할 수 있습니다.

그러나 항상 이 작업을 수행해야 하는 진짜 이유는 해제를 통해 응용프로그램에서 유휴 런타임 버그가 노출되는 경우가 많기 때문입니다.

메모리 손상을 유발하거나 포인터 주소를 변경하는 버그가 있는 경우 해당 버그는 무음 상태로 남아 있을 수 있습니다.버그와 전혀 관련이 없는 것을 변경하여 메모리 레이아웃을 변경할 때까지.그러면 갑자기 충돌이 발생하고 그 이유를 알 수 없게 됩니다. 방금 추가한 코드에서 버그가 발견되지도 않았기 때문입니다.

기억을 자유롭게 함으로써, 여러분은 그러한 벌레들을 표면으로 나오게 합니다.힙에 문제가 있거나 힙을 가리키는 포인터에 문제가 있으면 호출하는 지점에서 충돌이 자주 발생하기 때문입니다.free()즉, 프로그램을 발송하기 전에 찾아야 하는 심각한 버그가 어딘가에 있다는 것입니다.

프로그램 종료 전에 메모리를 확보할 필요가 없습니다.어떤 식으로든 프로그램을 종료하면 모든 메모리가 자동으로 할당 해제됩니다.

OS에 따라 다릅니다.최선의 방법은 명시적으로 해제해야 한다고 말씀드리고 싶습니다.또한 발그랜드와 같은 도구를 사용하는 것은 PITA입니다. 만약 당신이 모든 곳에서 메모리가 해방되지 않았고 나는 무엇이 좋고 나쁨 등을 구분할 수 없습니다.

메모리를 명시적으로 해제하는 OS에서는 다른 리소스의 문제가 여전히 발생합니다.앱이 성장하기 시작하고 타사 라이브러리를 끌어들이기 시작하면 리소스가 유출될 수 있습니다.제가 도서관을 썼다고 상상해 보세요. 여러분이 핸들러를 가까이 불러달라고 요청합니다.이 핸들러는 사용자가 닫기를 호출하지 않는 한 삭제되지 않는 임시 파일에 의해 백업됩니다.또는 백그라운드에서 실행 중인 프로세스를 분리하여 신호나 다른 리소스를 사용하여 관리합니다.

저는 완전히 반대의 시나리오를 가지고 있었습니다. 타사 라이브러리에서 정적 객체의 파괴자를 분리하는 것이었습니다.종료하기 전에 메모리 풀을 명시적으로 확보하기 때문입니다.합리적이고 프로그램 구조에 집중하는 것이 좋다고 생각합니다.

언급URL : https://stackoverflow.com/questions/36584062/should-i-free-memory-before-exit