메모리 할당과 해제에서 해제시 에러가...

hitman7의 이미지

아래의 코드에서 free() 함수를 호출하면서 glibc에서 invalid pointer라면서 뻗내요..
malloc으로 할당한 메모리는 해제 해주어야 한다는 기본전제 하에 free를 시켜줬고...주소도 정확한다..해제가 안되네요.
뭐 반복 구조도 아니고 한번 실행하고 빠져 나가는 것이라 그다지 치명적이지는 않을것 같은데...아무래도 궁금해서 진도가 안나가지네요...^^;

[code]

void read_config()
{
  char lineptr[1024];
  char tokenbuf[1024];
  char* title;
  char* value;

  char seperator[]="=";
  char valuesperator[]=" ";
  
  FILE *in;

  title=(char*)malloc(1024);
  value=(char*)malloc(1024);
  memset(lineptr,0x00,sizeof(lineptr));
  memset(tokenbuf,0x00,sizeof(tokenbuf));
  
  in=fopen("server.conf","r");
  
  if(in==NULL)
  {
    printf("no config file exist - shutdown server application\n");
    exit(0);
  }
  
  while(fgets(lineptr,1023,in)!=NULL)
  {
    printf("%s\n",lineptr);
    if(memcmp(&lineptr[0],"#",1))
    {
      strcpy(tokenbuf,lineptr);
      title=strtok(tokenbuf,seperator);
      value=strtok(NULL,seperator);
      if(value==NULL)
      {
        printf("Invalid config file : missing seperator?\n");
        exit(0);
      }
      else
      {
        remove_white_space(title);
        remove_white_space(value);
      }
    }
  }
//  free(title);
//  free(value);
  fclose(in);
}

[/code]

doldori의 이미지

title=strtok(tokenbuf,seperator);

이렇게 하면 title는 할당된 메모리가 아니라 strtok()이 반환한 주소를 가리키게 됩니다.
당연히 free()를 하면 안되죠.
지금은 malloc()과 free()를 아예 없애버리면 되겠네요.

hitman7의 이미지

항상 하던 실수였네요..ㅡㅡㅋ
역시 코드는 다른사람이 봐야 하나요...ㅠ,.ㅠ

감사합니다.

far and hard way

ssehoony의 이미지

malloc 와 free 에 대해 이해가 약간 부족하시네요.
free 를 할때는 malloc 으로 할당 받은 영역중 어느 임의의 한곳을
가르치키는 포인터를 이용해서 free 를 할 수 있는 것이 아니고
malloc 으로 할당받은 영역은 맨처음, 즉 malloc 시에 반환받은 바로 그 포인터주소로만 free 가 가능합니다.

좀 더 깊은 이해를 원하신다면
malloc 과 free 의 내부 구현이 어떻게 되어있는지 알아보시면 도움이 될겁니다.
C로 계속 개발하실 분이라면 malloc 과 free 의 내부 구현 원리는 알아두시는게 참 좋습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.