[완료] 메모리 할당 및 해제에 관련된 C소스인데 문제점을 모르겠습니다. 도와주세요 ㅠㅠ

upersbird의 이미지

- 내용 요약

: 단순 연결 리스트를 통해서 노드에 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--;
    }
}
upersbird의 이미지

이런 소스코드는 어떻게 이쁘게 올리시는지....궁금했습니다....참고할 사이트 던져주시면 감사감사 ㅠㅠ

raymundo의 이미지

코드를 code 태그로 둘러싸 주세요.

(code)
소스코드..
(/code)

괄호대신에 부등호로 바꿔서요.

좋은 하루 되세요!

upersbird의 이미지

바로 적용하였습니다^^^^^

klara의 이미지

질문이 뭔지 파악하기 힘드네요.
메모리를 해제해도 점유량에 변화가 없는것을 문제점이라고 부르시는 건가요?
그건 문제점이 아니라 정상적인 동작입니다.
프로그램내에서 메모리의 할당과 해제는 매우 자주 일어나기 때문에 성능을 위해서 프로그램에서 해제된 메모리는 바로 운영체제에 회수되지 않는게 보통입니다.
이게 질문이 아니라면 질문요지를 적어주세요.

upersbird의 이미지

질문이 애매모호한건 사실이네요 ㅠㅠ 네~xylosper님 말씀이 맞아요 ㅠㅠㅠ
그러면....
1. 어떻게든 회수를 해야겠다면 어떻게 할까요?
2. 테스트할때 운영체제가 회수하는 상황은 어떻게 되나요??

jick의 이미지

어떻게든 특정 시점에서 반드시 OS에게 메모리를 돌려주고 싶다면, malloc/free 대신 OS를 직접 불러서 메모리를 할당받는 법이 있습니다.
mmap/munmap으로 메모리를 할당받는 예제 코드를 찾아보세요. (아마 Stevens의 Advanced Programming in the Unix Environment에 나오지 싶은데...)

* 단, 이 방법은 메모리 할당/해제시마다 system call 비용이 들어가기 때문에, 본인이 이런 방법의 장단점을 명확히 파악하고 있지 않다면 프로그램 속도만 왕창 느려지는 삽질로 끝날 수 있습니다.

upersbird의 이미지

확인하였습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.