리눅스 환경에서의 링크드리스트 해제할 때에 관해서

익명 사용자의 이미지

얼마전에 친구가 물어봤는데 저도 확실하지가 않아서요
리눅스에서 링크드 리스트를 해제할 때 nextnode값 (Struct *node next; 같은)도 NULL로 바꿔줘야되냐고 물어보더라구요.
저는 그냥 free만 해주면 된다고 했는데 얘 말로는 NULL로 안바꿔주면 계속 메모리 오류가 난다고 하더라구요.

예를들어
1->2->3 이런식으로 있다했을때
2,3만 해제해주고
다시 할당을 1->2'->3'같이 할 때 문제가 생긴다고 하는데
3'을 할당할때 3과 같은 메모리 공간을 할당한다면 nextnode값이 NULL이 아니니 어떤 공간을 가르키는게 아니냐고 하는데 이게 가능 한건가요?
저는 free하면 알아서 data값도 없애버리는 걸로 알았는데

chadr의 이미지

링크드 리스트를 구현할 때 next가 null인 노드를 마지막 노드로 간주 하도록 구현하기도 합니다.
그렇게 구현 했을 때 마지막 노드를 삭제하고 이전 노드의 next를 null로 설정 하지 않으면 어떻게 동작할까요?
고민 해보시면 정답이 나옵니다.

그래도 잘 모르시겠으면 종이에 단계별로 그려서 한번 보시면 알수 있을거에요.

free는 주어진 주소값을 힙에서 사용하지 않는 메모리로 반환할 뿐이지 주소값을 가지고 있는 포인터 변수의 값을 특정 값으로 다시 기입해주지는 않습니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

익명 사용자의 이미지

답해주신분은
1->2 "->" 얘를 NULL로 바꿔주지 않은 상황을 말해주시는 것 같은데

저가 알고싶은부분은

1은 그대로있고
1->2->3이 할당된 상태에서
2,3을 해제하고 새로운 노드 2', 3'을 할당하는 상황입니다

이때 만약 2,3의 next값을 초기화 해주지 않고 해제를 했을 때
2', 3'이 할당 될 때의 영역이 2,3과 같다면
2', 3'의 next값이 2,3의 next 값과 같을 수 있을까라는 영역의 질문입니다.

"free는 주어진 주소값을 힙에서 사용하지 않는 메모리로 반환할 뿐이지 주소값을 가지고 있는 포인터 변수의 값을 특정 값으로 다시 기입해주지는 않습니다"

라고 적어주신거 보면 충분히 저런 경우가 발생할 가능성도 있을거 같은데 맞을까요?

익명 사용자의 이미지

추가로 많은 인터넷에서의 기본 링크드리스트의 생성과 소멸에 관한 글들을 보면
해제할때
단순히 free만 하는 경우가 많던데
확실하게하기 위해선 모든 데이터 값을 바꿔줘야하는게 맞는건가요?

익명 사용자의 이미지

요새 free()/malloc()을 잘못 쓰는 방법에 대한 질문이 계속 올라오는 걸 보니 과제철인 것 같군요 :( malloc()으로 할당받은 메모리에는 무엇이 들어있을 지 알 수 없기 때문에 는 무조건 0이든 필요한 값이든 초기화시켜 줘야 하고, free()로 해제한 메모리는 더 이상 손 대면 안 됩니다.

chadr의 이미지

추가 질문까지 같이 답변드릴게요.

일단.. 2,3을 할당했다가 삭제하고 2,3을 재할당했을때 동일한 메모리에 할당될 보장이 어디에 있을까요?
보장 없습니다. 힙의 메모리 할당 알고리즘에 따라서 동일 크기 메모리를 할당,삭제,할당 할 경우 동일한 주소를 반환할 수 있을지도 모르지만 그 중간에 크기가 다른 메모리를 할당하거나 여러 스레드에서 다발적으로 메모리를 할당하면 보장 못합니다.

그리고 "free는 주어진 주소값을 힙에서 사용하지 않는 메모리로 반환할 뿐이지 주소값을 가지고 있는 포인터 변수의 값을 특정 값으로 다시 기입해주지는 않습니다"

라고 이야기 한 것은 free의 동작 방식을 이야기 한것이에요. 포인터 변수에 null을 대입하는 것 또한 cpu 시간을 잡아먹는 행위이므로 free라는 함수가 굳이 매번 할 필요가 없습니다. 프로그래머가 필요하면 직접 null을 할당하면 되는 것이죠.

마지막으로 추가 질문 하신건 아무래도 삭제 대상인 노드의 주소를 가지는 포인터를 null로 채워야하냐를 이야기 하는것 같습니다. 당연히 삭제 대상 노드의 주소를 가졌던 포인터를 null로 채울 필요는 굳이 없습니다. 구현에 따라서 필요가 있으면 해야하는 것입니다. 제가 말한 것은 리스트의 마지막을 next가 null인 노드로 인식하도록 구현된 경우에 next가 null로 채워야한다는 이야기입니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

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