[완료] 메모리 할당 및 해제에 관련된 C소스인데 문제점을 모르겠습니다. 도와주세요 ㅠㅠ
글쓴이: upersbird / 작성시간: 화, 2012/07/31 - 7:10오후
- 내용 요약
: 단순 연결 리스트를 통해서 노드에 malloc을 할당한 값을 순차적으로 넣고, 순차적으로 메모리 해제를 하는 소스입니다.
메모리 해제 시 alloc된 주소와 free 주소가 일치하는데 해제하고 top으로 찍어보면 메모리 점유율은 같습니다.
valgrind --leak-resolution=high --log-file=memcheck.txt --trace-malloc=yes --leak-check=yes --show-reachable=yes -v [실행]
결과 메모리 누수가 발생하지 않았습니다. 이런 경우는 어떤 경우인지 설명좀 해주시면 정말 감사하겠습니다. ㅠㅠ
- 소스 코드(간단합니다...ㅠㅠ)
[[[main.c]]]
#include <stdio.h> #include <stdlib.h> #include "test.h" list_t bbb; int main(int argc, char** argv) { int i, count; init(&bbb); for(i = 0; i < 50000; i++) { char* aaa = (char*)malloc(10000); if (!aaa) { perror("Memory allocation fail"); break; } sprintf(aaa, "hello - %5d", i); printf("malloc: %3d\t", i+1); add(&bbb, aaa); } sleep(5); count = bbb.count; for(i = 0; i < count; i++) { printf("free: %5d\t", i+1); del(&bbb); } printf("mFL->head: %s\n", bbb.head?"head is not null":"head is null" ); sleep(1000); // top이나 ps로 메모리 사용량을 보려고 잠시 정지를....쿨럭... return 0; }
[[[test.h]]] 이녀석은 그냥 단순 연결 리스트입니다. 제가 여기에서 잘못 만들었는지.....ㅠㅠ
typedef struct _datas { char* aaa; }datas_t; typedef struct _node_t { datas_t* data; struct _node_t* link; }node_t; typedef struct _list_t { node_t* head; int count; }list_t; node_t* top; void init(list_t* list) { if(list == NULL) return; list->count = 0; list->head = NULL; } void insert_node(node_t** h, node_t* q) { if(*h == NULL) { q->link = NULL; *h = q; top = q; } else { q->link = NULL; top->link = q; top = top->link; } } void remove_node(node_t** h) { node_t* q = *h; *h = q->link; free(q->data->aaa); free(q->data); free(q); } void add(list_t* list, char* aaa) { node_t* node = (node_t*)malloc(sizeof(node_t)); if (!node) { perror("Memory allocation fail in add() function: node"); return; } node->data = (datas_t*)malloc(sizeof(datas_t)); if (!node->data) { perror("Memory allocation fail in add() function. node->data"); return; } node->data->aaa = aaa; insert_node(&(list->head), node); list->count++; } int is_empty(list_t* list) { if(list->head == NULL) return 1; else return 0; } void del(list_t* list) { if(!is_empty(list)) { remove_node(&(list->head)); list->count--; } }
Forums:
추가적으로.....
이런 소스코드는 어떻게 이쁘게 올리시는지....궁금했습니다....참고할 사이트 던져주시면 감사감사 ㅠㅠ
코드를 code 태그로 둘러싸
코드를 code 태그로 둘러싸 주세요.
(code)
소스코드..
(/code)
괄호대신에 부등호로 바꿔서요.
좋은 하루 되세요!
감사합니다.
바로 적용하였습니다^^^^^
질문이 뭔지 파악하기 힘드네요. 메모리를 해제해도
질문이 뭔지 파악하기 힘드네요.
메모리를 해제해도 점유량에 변화가 없는것을 문제점이라고 부르시는 건가요?
그건 문제점이 아니라 정상적인 동작입니다.
프로그램내에서 메모리의 할당과 해제는 매우 자주 일어나기 때문에 성능을 위해서 프로그램에서 해제된 메모리는 바로 운영체제에 회수되지 않는게 보통입니다.
이게 질문이 아니라면 질문요지를 적어주세요.
그쵸....ㅠㅠ
질문이 애매모호한건 사실이네요 ㅠㅠ 네~xylosper님 말씀이 맞아요 ㅠㅠㅠ
그러면....
1. 어떻게든 회수를 해야겠다면 어떻게 할까요?
2. 테스트할때 운영체제가 회수하는 상황은 어떻게 되나요??
...
어떻게든 특정 시점에서 반드시 OS에게 메모리를 돌려주고 싶다면, malloc/free 대신 OS를 직접 불러서 메모리를 할당받는 법이 있습니다.
mmap/munmap으로 메모리를 할당받는 예제 코드를 찾아보세요. (아마 Stevens의 Advanced Programming in the Unix Environment에 나오지 싶은데...)
* 단, 이 방법은 메모리 할당/해제시마다 system call 비용이 들어가기 때문에, 본인이 이런 방법의 장단점을 명확히 파악하고 있지 않다면 프로그램 속도만 왕창 느려지는 삽질로 끝날 수 있습니다.
확인하였습니다!
확인하였습니다!
댓글 달기