C에서 프로젝트를 개발 중이고 할당 된 메모리를 확보하고 종료하기 전에 열려있는 모든 파일을 닫아야합니다.전역 변수를 사용하지 않고 atexit 또는 유사하게 메모리를 비울 수있는 방법이 있습니까?
가능한 모든 종료 시나리오가 있기 때문에이 모든 작업을 수행하고 atexit
이라고 부르는 clean
함수를 구현하기로 결정했습니다.
문제는 atexit
에서 매개 변수가있는 함수를 설정할 수 없기 때문에 처리가 끝날 때 해제해야하는 포인터를 clean
(으)로 보낼 수 없습니다.
그래서 전역 변수로 해제해야 할 수도있는 모든 포인터와 프로그램에 열려있는 모든 파일을 선언해야합니다. (나는 이미 그것을했으나 좋지 않습니다) 또는 매개 변수를 보낼 수있는 atexit
과 유사한 기능이 있습니까? 아니면 내가 놓친 다른 방법이 있을까요?
#include <stdio.h>
#include <stdlib.h>
void atexit_clean(void *data);
static void clean(void)
{
atexit_clean(NULL);
}
void atexit_clean(void *data)
{
static void *x;
if (data) {
x = data;
atexit(clean);
} else {
free(x);
}
}
int main(void)
{
int *a = malloc(sizeof(int));
atexit_clean(a);
return 0;
}
단일 글로벌 변수를 사용하는 또 다른 방법은 : 함수 내에서 정적 포인터를 사용
메모리 풀을 가리키는 변수가 하나만 있으면됩니다. 그건 받아 들일 만해. – this
최신 소비자 운영 체제를 사용 중이라면 종료 할 때 모든 리소스가 해제됩니다. 즉, 할당 된 메모리가 모두 해제되고 열려있는 모든 파일이 닫힙니다. –
또한 예 : 파일을 전체 프로세스 런타임 중에 열어야 할 필요가 있다면 여러 위치에서 액세스 할 수도 있습니다. 즉, 이미 전역 변수이거나 적어도 하나의 번역 단위에있는 전역을 의미합니다. 그런 다음 닫을 수있는 함수를 가질 수 있습니다 그 파일은 전역'clean_all' 함수에서 호출됩니다. 할당하는 메모리와 동일합니다. –