HeapAlloc을 통한 메모리 할당에 관하여...

superdma의 이미지

아래 코드에서 HeapAlloc을 통해서 Physical memory에 만큼 메모리를 할당했습니다.
그런데 스트링을 heap에 copy할떄 10글자가 넘어가게 되는데, 이떄 따로 HeapAlloc을 안해도 Windows에서 미리 잡아놓은 가상메모리 상의 RESERVE된 페이지를 보고 거기에 맞춰 Physical memory에 자동할당 하는것 입니까?
그렇다면 초기에 Commit 되는 페이지를 작게 잡아도 필요에 의해 알아서 늘려준다는 애기 같은데...

답변부탁드립니다.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h> 
 
int main(int argc, TCHAR *argv[])
{
	HANDLE hDefaultHeap = GetProcessHeap();
	TCHAR * pDefault = (TCHAR *)HeapAlloc(hDefaultHeap, HEAP_NO_SERIALIZE, sizeof(TCHAR) *10);
	_tcscpy(pDefault, _T("Default Heap!"));
	_tprintf(_T("%s \n"), pDefault);
	HeapFree(hDefaultHeap, HEAP_NO_SERIALIZE, pDefault);
 
	return 1;
}
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.

superdma의 이미지

_tcscpy(pDefault, _T("Default Heap!"));
이 코드는 문제가 있는 코드라는 말이군요.
윤성우씨의 뇌를자극하는 윈도우즈 시스템 프로그래밍책의 694쪽에 있는 DynamicHeap.cpp 예제 입니다.
참고로 brain.hanb.co.kr 해당 콘텐츠에 들어가시면 소스 코드를 다운 받을 수 있습니다.

powerson의 이미지


이게 바로 overflow죠.. overflow는 최대한 피해야 하는 버그 중에 하나입니다. 이러한 코드들이 들어가면 윗분 말씀처럼 나중에는 메모리가 꼬이게 되는데, overflow로 인해서 생기는 버그는 run-time에서 찾아내는 버그 중에 그닥 쉽지 않습니다. 항상, 이러한 부분은 조심해야 할 부분입니다.

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

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

댓글 달기

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