약간 어이없게 들리는 free() 관련 질문입니다

kakikaki의 이미지

다름이 아니고 현재 플밍 공부하는 학생입니다 ;;

malloc 으로 메모리를 할당하면 그것은 해당 프로그램에게 운영체제가 할당하는 힙 이라는 영역에 메모리를 할당하기 때문에, 내부 서브함수에서 malloc 을 하던 어디서 malloc 을 해도 할당된 영역은 보존된다는 사실은 알겠습니다만.

만일 malloc 후 free() 를 하기전에 프로그램이 강제 종료되거나, 도중에 세그폴트로 중단되면

할당된 메모리 영역은 어떻게 되는것인지요 ;;;

운영체제가 다시 가져가는 겁니까? ;ㅅ;

gamdora의 이미지

Generic한 건 모르지만 specific한 걸 알려드리지요. :)

윈도우*와 리눅스*에서 실험했을 때에는 메모리가 반환되는 걸 확인했습니다.

Generic한 건 다른 분이 알려주셨으면 좋겠네요. :)

sunyzero의 이미지

네 완벽하게 반환됩니다.

프로세스가 종료되면 사용된 메모리는 운영체제가 컬렉션합니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

powerson의 이미지


어제인가 달았던 글로 기억납니다. ^^
한번 읽어보시면 될거 같습니다.

http://kldp.org/node/73521

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kakikaki의 이미지

덕택에 좋은걸 알았습니다. 자세한 답변에 감사드려요 ;

근데 실험은 어떻게 하면 되죠? -ㅁ-?

malloc 으로 메모리 할당 후 데이터 삽입
해당 메모리 주소를 파악한 다음 프로그램을 킬.

그 후 해당 메모리 주소를 다른 프로그램 포인터 변수에 삽입한 후 참조해서 내용을 보기. 시도해 보면 알 수 있을까요?

제 생각엔 이런데, 더 좋은 방법이 있는지요

--------------------------------------
춤추라! 사랑하라! 노래하라! 살라!

- 아무도 바라보고 있지 않은 것처럼
- 한 번도 상처받지 않은 것처럼
- 아무도 듣고 있지 않은 것처럼
- 오늘이 마지막 날인 것처럼

춤추라! 사랑하라! 노래하라! 살라!

- 아무도 바라보고 있지 않은 것처럼
- 한 번도 상처받지 않은 것처럼
- 아무도 듣고 있지 않은 것처럼
- 오늘이 마지막 날인 것처럼

M.W.Park의 이미지

접근방법이 약간 잘못된거 같네요.
모든 프로세스는 독자적인 주소영역을 가집니다.
의미없는(권한이 없는) 주소를 참조하는 순간 segfalut가 날것입니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

익명사용자의 이미지

모든 프로세스는 커널에서 task_struct를 가지고잇씁니다.
각각의 task_struct는 Memory를 나타내기위한 mmap을 가지고있고
그 mmap은 vm_struct_area를 가지고있습니다.
이 vm_struct_area가 그 프로세스가 가지고있는 가상주소공간이죠..

한 프로세스가 가지고있는 Virtual memory를 개략적으로 설명하면
-------------------------------------------------------------------------------
| |
-------------------------------------------------------------------------------
^~~~~~~~~~~~^ ^~~~~~~~~~~~~^ ^~~~~~~~~~~~~^
code 영역 data 영역 heap 영역

위에서 설명된 "code 영역", "data 영역", "heap 영역"을 나타내는게 vm_struct_area입니다.
또한 vm_struct_area는 vm_start와 vm_end값을 가지고있습니다. 말그대로 vm_struct_area의 영역이 시작지점과 끝지점을 명시합니다.

heap을 할당받기 위해 malloc을 하는 과정은 -> "heap영역" vm_struct_area의 vm_end를 늘려줍니다.
(여기선 단지 vm_end값만 늘려주고, 실제 메모리가 쓰일때 page table에 맵핑됩니다.)
heap의 free과정 -> "heap영역" vm_struct_area의 vm_end를 줄여줍니다.
프로그램이 종료될때 -> struct_task의 mmap을 따라가서 모든 vm_struct_area의 값들 "code영역", "data영역","heap영역"을 비워줍니다. 즉 새는 메모리가 있다한들 프로그램이 종료될때 다 flush가 되는거죠.

kakikaki의 이미지

답변해 주신 모든 분들께 진심으로 감사드립니다 ;ㅅ;

특히 맨 마지막 분의 답글은... 감동이 아니밀려올 수 없군요 ;ㅅ;

더 자세한건 검색해서 알아보겠습니다. 감사합니다

(어떤 책을 보면 그런걸 알 수 있을까요? ;ㅅ; - 설마! 리눅스 커널의 이해?!)

춤추라! 사랑하라! 노래하라! 살라!

- 아무도 바라보고 있지 않은 것처럼
- 한 번도 상처받지 않은 것처럼
- 아무도 듣고 있지 않은 것처럼
- 오늘이 마지막 날인 것처럼

춤추라! 사랑하라! 노래하라! 살라!

- 아무도 바라보고 있지 않은 것처럼
- 한 번도 상처받지 않은 것처럼
- 아무도 듣고 있지 않은 것처럼
- 오늘이 마지막 날인 것처럼

익명사용자의 이미지

(어떤 책을 보면 그런걸 알 수 있을까요? ;ㅅ; - 설마! 리눅스 커널의 이해?!)

==> 정답입니다.

powerson의 이미지


설마가 아니라 Linux에 관련된 내용이라면, 리눅스 커널의 이해 책을 보시면 나옵니다. task_struct와 vma_struct_area에 관련된 내용은 모두 커널 자료구조라는걸 아실겁니다. process와 메모리 관련 부분에 나오는 내용이죠.(내용이 상당히 방대합니다.)

그리고 윈도우쪽이라면 사실 저도 읽어보진 못했지만, Window Internals에 나오지 않을까 싶습니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

ohhara의 이미지


참고사항으로 말씀드리자면
아주 simple한 OS(MMU도 사용하지 않는!)위에서 도는 application이라면 자동으로 free되지 않는 경우도 많습니다. 즉, 이식성이 좋게 application을 만드는게 좋으므로 가능하면 free를 다 해 주는게 좋습니다.

Taeho Oh ( ohhara@postech.edu , ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Digital Media Professionals Inc. http://www.dmprof.com

Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com

댓글 달기

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