[질문] memory를 해제후 null 로 초기화를 다시 수행하시나요?

nickcave의 이미지

C 언어에서 memory를 해제후에 ( free 를 이용해서) 다시 포인터를 null 로 초기화하는 방식을 사용하시나요?

어제 책을 읽다가 포인터의 memory free 이후에 해당 포인터를 null 로 초기화 한다는 내용을 읽어서요,

개인적으론 memory free 하면 null로 초기화 하지 않아서요.. 이렇게 사용하시는 분 계신가요??

감사합니다.

doogle의 이미지

저같은 경우에 free후 NULL로 항상 초기화 합니다.
(메모리 잡는것도 특별한 경우가 아니면 대체적으로
malloc보다는 calloc을 사용하죠. )

뭐 상황에 따라 다르겠지만 말입니다.
버릇들여 놓으면 안하는 경우 괜히 불안하더군요.

메모리 다쓰고 free후엔 포인터에 있는 값은 이제 쓰레기값입니다.
메소드나 함수가 더이상 그 포인터를 절대로 쓰지 않는다면
NULL로 초기화하지 않아도 상관없겠죠.

하지만... 코드를 수정하면서 해당 포인터를 재사용하거나 하는
여러가지 경우로 복잡해지기 시작하면 NULL초기화 하지않아
여러가지 오류를 발생할 여지가 있습니다. 보통 포인터 사용전에
assert 걸어서 검사합니다만 NULL처리 되있지않은 쓰레기값이면
아무런 의미가 없게되고요.
물론 이런상황이 안되도록 리팩토링하는것이 가장 중요하겠습니다만...

잠깐 옆길로 새서...
C나 C++인 경우엔 free 함수를 쓰기때문에 가끔 생각하게 되는
문제입니다만, 저같이 델파이를 주로 사용하는 경우엔 이미
FreeAndNil 함수를 사용해서 알아서 포인터에 nil ( NULL 과 비슷한 의미임) 처리를 해주기때문에 고민안하고 좋더군요.

ironboy의 이미지

free후에 NULL로 초기화하는 것은 물론,
선언시에도 NULL로 초기화 합니다.

{
   pointerType  *p = NULL;

  .............

   if ( p ) {free(p); p=NULL;}
}

이게 버릇이 되면,
사소한 실수로 메모리가 새는 경우는 웬만큼 막을 수 있죠..

nickcave의 이미지

답변 감사합니다.

저도 다음부터는 memory free 이후에 null pointer 초기화를 해야 겠네요..^^;

부모님께 효도합시다.

chadr의 이미지

습관의 차이이지만 저같은 경우에도 메모리를 free하거나 포인터를 선언시 반드시 NULL로 초기화를 합니다.

free를 한 후에 NULL로 초기화를 안하면 해당 포인터에는 아직도 예전에 쓰던 포인터 값이 존재하는데 이는 이미 운영체제에게 반납된 메모리이므로 다음번에 해당 메모리를 엑세스 할 시에 대부분 프로그램이 죽습니다.

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