메모리 free를 했습니다. 그런데 값이 0x01입니다.

kisungcho의 이미지

스레드 프로그램에서 network서비스를 하는데 한명에 대한 접속을 할때 thread를 생성시키고 서비스가 끝나면 스레드가 종료됩니다.
이때 가끔식 세크먼트 폴트 나며 프로그램이 죽습니다.
이유는 이미 free해준 메모리의 값이 0x00이 아니라 0x01이렇게 처리 되어서 죽습니다.
메모리를 free해줬는데 이런 경우도 있나요?

eungkyu의 이미지

메모리를 free한다고 0이 되지는 않는걸로 알고 있습니다.
프로그래밍을 편하게 하기 위해 free한 후 인위적으로 0으로 만드는 경우는 있습니다만...

kisungcho의 이미지

답변 고맙습니다.

또 malloc_usable_size 메시지가 나오고 세크먼트 폴트 나며 프로그램이 죽습니다. 자주 이 메시지가 나오는데 malloc에서도 나오고 free에서도 나오고 10번에 3번정도 나오는 것 같습니다.
cpp여서 그런가요?
막을 방법이 없을까요?

litdream의 이미지

char *buf;
...
buf = malloc( size_calculated );
...
free(buf);

// 여기서 buf = NULL 안해주면 다음에서 segfault 납니다.
// buf = NULL;

if ( !buf ) {
   printf("str : %s\n", buf);
}

혹시 이경우 아니신지~~~?

삽질의 대마왕...

ssehoony의 이미지

cpp 라...
기본적으로 malloc 은 free 로 지우고 new 는 delete 로 지워야 합니다.
malloc 와 new 가 같은 메모리 매니저를 이용해야 한다는 표준안이 없기 때문에 malloc 으로 생성한걸 delete 지우면 문제가 될 수도 있습니다.
혹시 이런 문제는 아닐까요?

그리고 malloc 이나 free 함수콜 자체에서 에러의 발생한다면, 가장 빈번한 이유는 malloc 으로 생성한 메모리의 버퍼 언더/오버 플로우에 의해 malloc 이 메모리 관리를 위해 기록한 데이터 부분을 손상시켰을 때 입니다.

ctcquatre의 이미지

스레드라면 충분히 가능한 이야기 같습니다.

다른 스레드에서 메모리가 해체된 이후에 참조할 확률이 많을것
같습니다. free에 의해 발생한 seg fault가 맞다면
스레드를 종료부분 적절한 위치에 테스트 출려구문을 넣어주고
한번 테스트해보시기 바랍니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

htna의 이미지

정말 잡기 어려운 버그중에 하나가.
할당된 메모리 범위를 벗어나는 영역에 접근하는 것입니다.
님의 경우에도, 모두 검토해 봐서, 다른경우에 이상이 없다면, 이 문제를 의심해 보시기 바랍니다.
이 문제를 가장 잘 인식하기 쉬운 방법은 적재적소에 assert()를 넣는것입니다.

PS:
허가되지 않은 메모리의 접근에 의한 버그는..
그 버그의 위치에서 문제가 발생하지 않습니다.
그 위치를 넘어간 이후에 발생하는데.
이는 경우에 따라 다른곳에서 생기기 때문에,
아무래도 경험의 중요성이 대두되는군요..
그럼 버그 잘 잡으시기 바랍니다.
^^

WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra

댓글 달기

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