일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 진수변환기
- Kotlin
- vscode
- 문자열다루기
- background service
- vs code
- socket
- foreground service
- FTP
- 자료구조
- 소켓프로그래밍
- 콘솔 키보드 이벤트
- dart
- C
- InfluxDB
- flutter
- dictionary
- Android
- InfluxDBClient
- 연결리스트
- Mat 변수
- ws2_32.lib
- 메모리반환
- 문자열파싱
- 코틀린
- 문자열 다루기
- 파일입출력
- UI
- 딕셔너리
- Linked List
- Today
- Total
무슨 일로 C 하셨습니까?
[C] 메모리 반환 본문
C를 가지고 여러 가지 프로그램을 만들다 보면 모종의 이유로 메모리 관리에 신경 쓰게 된다.
이러한 메모리를 반환시키는 함수를 만들도록 하겠다.
사실 동적할당된 메모리만 free()를 사용해서 반환하면 그만이다
그런데 해당 변수가 어디서 선언됐는지 모르면 이야기가 달라진다
( 포인터가 가르키는 메모리가 동적 변수인지 지역변수인지 알 방법이 없다)
지역변수를 free()하면 에러가 발생하기 때문에
정체모를 메모리를 반환시켜주는데 큰 애로 사항이 꽃피기 시작한다.
고로 자동으로 구분해서 메모리를 반환하는 함수를 만들어주면 되겠다
함수 기능 | 메모리를 알아서 잘 반환 시켜줌 |
입력값 | 어디서 선언됐는지 모를 메모리 주소 |
대충 설계를 해보자면 메모리가 어디에 할당됐는지 알기만 하면 되는데
그것을 알방법이 주소뿐이니
위 그림을 참고하도록 하자
지역변수(Stack)은 아래에서 위로
동적변수(Heap)은 위에서 아래로
할당이 된다고 한다.
그런데 중간중간 메모리가 반환되고 하다 보면 실제로 위아래가 반드시 성립하는 것이 아니다
하지만 지역변수에 비해 동적변수가 더 높은 메모리 주소를 갖는 것은 거의 기정사실이다
이를 활용하면 되겠다.
void autofree(void* target) {}
함수의 이름은 자동으로 돌아가길 바라는 염원을 담아 자동 반환으로 한다.
int local;
int* dynamic = (int*)malloc(sizeof(int));
int local_adr, dynamic_adr, target_adr;
local_adr = &local;
dynamic_adr = dynamic;
target_adr = target;
다음과 같이 임의의 지역변수와 동적 변수를 할당하고 반환시키려는 메모리까지
총 세가지 메모리의 주소를 저장해놓자
printf("local is : %p\n", local_adr); // local is : 000000CAF50FFAB0
printf("dynamic is : %p\n", dynamic_adr); // dynamic is : 00000000528E5CB0
printf("target is : %p\n", target_adr); // target is : 00000000528E5C90
다음과 같이 주소를 확인해 볼 수 있다. ( 위는 target이 동적 변수인 경우로 주소는 매번 다르다 )
그리고 확인해보면 알겠지만 메모리 주소가 지역성?을 띄고 있기 때문에
지역변수끼리 동적변수끼리 메모리 주소가 비슷하다
int heap = target_adr - dynamic_adr;
heap = (heap < 0) ? (-1 * heap) : heap;
int stack = target_adr - local_adr;
stack = (stack < 0) ? (-1 * stack) : stack;
// 지역 변수
if (stack > heap) free(target);
// 동적 변수
//else
free(dynamic);
따라서 반환하려는 메모리의 주소 값을 앞에서 선언한 임의의 변수들의 주소와 빼주면
각 주소들간의 거리(?)를 알 수 있고 이를 통해 해당 변수가 어디에 할당되어있는지 유추할 수 있다.
완벽하다고 할 순 없으나 프로그램이 커지지 않는 한은 충분히 가능성이 있어 보인다.
void autofree(void* target) {
int local;
int* dynamic = (int*)malloc(sizeof(int));
int local_adr, dynamic_adr, target_adr;
local_adr = &local;
dynamic_adr = dynamic;
target_adr = target;
/*printf("local is : %p\n", local_adr);
printf("dynamic is : %p\n", dynamic_adr);
printf("target is : %p\n", target_adr);*/
int heap = target_adr - dynamic_adr;
heap = (heap < 0) ? (-1 * heap) : heap;
int stack = target_adr - local_adr;
stack = (stack < 0) ? (-1 * stack) : stack;
if (stack > heap) free(target);
// 지역 변수
//else
// 동적변수
free(dynamic);
}
이 함수가 정상 작동하는지는 직접 테스트해보길 바란다.
잘못되었다면 지역변수의 메모리를 반환하려하는 경우일 테니 아마도 런타임 에러가 발생할 것이다.
그 부분은 추후 생각해보자
'C - 이걸 굳이? > 유틸리티' 카테고리의 다른 글
[C] 키보드 이벤트 (0) | 2021.01.25 |
---|---|
[C] 문자열 다루기::문자열 복사 (0) | 2021.01.22 |
[C] 자료구조::딕셔너리 (Dictionary) _ 2 (2) | 2020.10.15 |
[C] 자료구조::딕셔너리 (Dictionary) (1) | 2020.10.13 |
[C] 자료구조::연결 리스트 (LINKED LIST) _ 2 (0) | 2020.10.07 |