[질문]특정포인터의 메모리 할당여부 체크..방법. free() 관련.

ㅡ,.ㅡ;;의 이미지

메모리 할당후 free() 로 해제 하는데

이때 특정 포인터의 메모리할당여부를 검사할방법이 있나요?

즉, a = malloc( 100 );

한후에 a 에 메모리가 할당되었는지를 체크할방법이 있는지...

mallinfo 에 포인터정보같은것이 들어있을줄알았는데 없더라구요.

==========================
질문이 좀모호하여 ..

함수로부터 return 되어온 변수 a 가 있는데 함수내부에서 여기에 메모리가 할당되었는지 안되었는지 알려고합니다.

lovemyin의 이미지

malloc 함수가 성공하여 a 값에 NULL 이 아닌 주소값이 오면 성공한건데요..
변수 선언시 포인터 변수는 항상 NULL로 초기화를 해주시고
free()하신 후에도 항상 변수값에 NULL을 넣어주는 습관을 가지세요..

제가 보기엔 이거 질문한건 아닐것 같고 혹시 소스코드상에서 변수가 메모리 할당된 변수인지
확인할 방법을 찾고 계신건가요?

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

ㅡ,.ㅡ;;의 이미지

네.. malloc 가 할당했는지가 아니고..

변수의 메모리주소가 할당된 번지인지 아닌지를 알고자 하는겁니다. 님이말씀하신 후자.

제가 다시 읽어보니 질문이 좀 오해하게 생겼네요..


----------------------------------------------------------------------------

모지리의 이미지

어떤 목적으로 사용하실려는지 잘 모르겠지만
상당히 가변적일거 같기도 합니다. 선언시 초기화를 해주지 않으면
임의의 주소가 들어갈테구요. 중간에 수정을 가했을 경우 주소가 바뀔수도 있구요.
메크로나 구조체를 써서 표기하시는 방법은 어떨까요?

일단 가장 일반적인것은

1. 선언
2. 초기화
3. 할당
4. 해제
5. 초기화

이런 수순을 보통은 걷잖아요 ?

lovemyin의 이미지

More Effective C++ 27번째 항목 "힙(Heap)에만 생성되거나 힙에는 만들어지지 않는 특수한 클래스를 만드는 방법"
을 보시면 비슷한 내용이 나와있습니다.
물론 C++ 에서 바라본건데 내용이 재미있으니 혹시 참고하셔도 괜찮을 것 같습니다.

제가 보기에는 C 언어 상에서 단지 포인터만 가지고 그것을 알아내는 방법은 없을 것 같은데 다른 고수분들이 혹시 알고 있을수동 있으니 확답을 하기가 어렵네요...^^

변수의 NULL 값 여부를 체크해서 아는 것이 가장 좋은 것이 아닐까 싶습니다.
혹시 방법 알게 되시면 꼭 답변 달아주세요.. 궁금해서...^^

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

jinseo1224의 이미지

저 또한 질문자님과 같은 의문에서 검색하던도중 오게되었습니다.

저의 경우에는 기존의 소스코드를 편집하지 않고 수정을 하는 과정에서
a 변수가 함수A에 있는 realloc()에 의해서 free()되거나 되지 않는 경우를 확인해야 했습니다.
A함수 이후에 항상 a를 free()하는 코드였기 때문에 realloc에 의해서 free()되었다면 오류가 발생하는 경우였죠.

테스트 해본 바로는
a 변수가 free()되었다 하더라도 다른 프로세스가 그값을 덮치지 않는이상 기존값을 유지합니다.
a를 free()한 이후에도 a 변수명을 이용하여 메모리 공간의 수정이 가능하더라구요.
따라서 한번 사용한 후에는 a에 담긴 값으로는 구별이 안될것 같습니다.

저의 문제는 realloc 시에 기존의 주소를 저장하였다가 realloc후의 주소와 같다면 a변수를 free()해주고
만약 realloc후 주소가 달라졌다면 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.