malloc이 50,000 바이트 이하면 free해도 메모리해지가 안되네요

shint의 이미지

malloc이 50,000 바이트 이하면 free해도 메모리해지가 안됩니다.
왜 일까요?
CString str;
int nSize;
if(pcData == NULL)
{
UpdateData(true);
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
pWnd->GetWindowText(str);
nSize = atoi(str);
pcData = (char*)malloc(nSize);
memset(pcData, '\0', nSize);
}

if(pcData != NULL)
{
free(pcData);
pcData = NULL;
}

auditory의 이미지

free 해도 메모리해지가 안된지는 어떻게 확인하셨어요??

chadr의 이미지

혹시 작업관리자에서 확인하신거라면 작업관리자에서 보여주는 메모리는 조금 다릅니다.
아래 링크를 참고하세요.

http://gpgstudy.com/forum/viewtopic.php?t=18745&highlight=%B0%FC%B8%AE%C0%DA

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

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

shint의 이미지

버추얼 메모리(VM) 사용량을 보세요'라는 답을 얻었습니다.
테스트 결과. free를 해도 VM에 남아 있었습니다. 참 난해합니다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

chadr의 이미지

운영체제가 판단하여 추후 메모리 할당시 빠르게 할당을 할수 있기 위해서 일부러 바로 반환하지 않는 경우도 있습니다.
사실 메모리 풀을 사용하지 않는 한 운영체제가 메모리 관리 하는 방식을 제어할 방법은 없으며 필요도 없습니다.

만약에 물리메모리가 부족하면 그때 운영체제는 할당된 가상메모리를 디스크로 스왑할테고, 사용하지 않는 메모리에 할당을 하도록 할것입니다.

메모리를 운영체제가 관리하는 방식이 아니라 직접 제어할려고 하신다면 메모리 풀을 이용하세요.:)
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

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

jick의 이미지

일반적으로 malloc/free를 할 때마다 커널을 불러서 메모리를 받아오고 반환하면 시간 낭비이기 때문에, 일반적으로 generic memory allocator는 free한 메모리를 시스템에 직접 반환하지 않고 자체 pool에서 들고 있다가 다시 malloc 요청이 들어오면 적당히 잘라서 다시 돌려주는 방식을 채택하고 있습니다.

Windows는 잘 모르지만, linux glibc에서 채택한 Doug Lea's allocator를 보면 그런 구조를 채택한 것이 잘 나와 있습니다. 알고리즘에 대한 자세한 설명은 다음 사이트를 참조하세요.

http://g.oswego.edu/dl/html/malloc.html

따라서 작은 크기의 malloc/free를 반복할 경우 OS kernel까지 아예 가지도 않고, OS가 파악하고 있는 해당 프로세스의 메모리 사용량은 그대로인 것이 일반적입니다. 단지 그 메모리 heap 안의 영역이 C runtime library에 의해 "사용중"/"사용 가능" 상태를 오락가락하는 거죠.

그래서 Linux에서 (매우 예외적인 케이스입니다만) 메모리가 부족하여 반환할 때 이것이 *즉시* OS에 반환되는 것을 보장하려면 일반적인 malloc/free를 써서는 보장이 안되고, mmap/munmap을 써서 system call을 직접 부르든지 하는 방식으로 동작해야 합니다. (오라클이 내부적으로 그런 방식을 쓴다고 알고 있습니다.)

M.W.Park의 이미지

FAQ 비슷하게 간간히 나오는 질문이네요.
KLDP 검색해보시면 관련 자료가 몇개 나올겁니다.

VC++ 환경에서 작업하시는 것같은데, debug 모드에서는 확실히 바로 free가 되지는 않았던 것으로 기억합니다. release 모드에서는 잘 기억이 안나지만 debug 모드랑은 조금 다른 현상을 보여줬던 것같습니다.

하나만 더 추가하자면, free시킨 메모리 영역에 쓰기를 한번 시도해보시면 정확히 알 수 있을겁니다.

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

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

realian의 이미지

..........No Sig.........|
-------------------+

#include <malloc.h>
 
malloc_trim( size ) ;

size 만 남기고 free 안되고 있는 메모리 정리합니다.

c++ 에서가 저렇고 c 에서는 인자 안받는거 같더군요...

gcc 기준입니다.

..........No Sig.........|
-------------------+

댓글 달기

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