HeapAlloc을 통한 메모리 할당에 관하여...
글쓴이: superdma / 작성시간: 금, 2009/08/21 - 1:40오후
아래 코드에서 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; }
Forums:
그러진 않습니다.
그러진 않습니다. 시스템에서 물리메모리에 매핑을 할 때 최소 기본단위가 있습니다. 적게 할당하나
많이 할당하나 최소한 기본 단위로 할당이 이루어지고 응용프로그램에서 할당을 요청했을 때
기본 크기보다 작은 경우에 요청하나 용량을 넘어서게 접근해도 어느정도 완충이 될뿐 시스템이
알아서 늘려주거나 그러진 않습니다. 운이 좋아서 그냥 넘어가는 것이지요. 그렇게 사용을 하다가
다음 할당때는 그 완충 부분을 할당하여 시스템이 리턴 할 수도 있습니다. 그러면 이제부터는 메모리가
꼬이는 것이지요. 요청한것 이외의 것을 사용하는건 절대 하시면 안됩니다.
-------------------------------------------------------------------------------
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.
그렇다면...
_tcscpy(pDefault, _T("Default Heap!"));
이 코드는 문제가 있는 코드라는 말이군요.
윤성우씨의 뇌를자극하는 윈도우즈 시스템 프로그래밍책의 694쪽에 있는 DynamicHeap.cpp 예제 입니다.
참고로 brain.hanb.co.kr 해당 콘텐츠에 들어가시면 소스 코드를 다운 받을 수 있습니다.
이게 바로 overflow죠..
이게 바로 overflow죠.. overflow는 최대한 피해야 하는 버그 중에 하나입니다. 이러한 코드들이 들어가면 윗분 말씀처럼 나중에는 메모리가 꼬이게 되는데, overflow로 인해서 생기는 버그는 run-time에서 찾아내는 버그 중에 그닥 쉽지 않습니다. 항상, 이러한 부분은 조심해야 할 부분입니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
댓글 달기