HeapAlloc, GlobalAlloc, LocalAlloc, VirtualAlloc, malloc, new 의 공통점 과 차이 점
LPVOID HeapAlloc(
HANDLE hHeap,
DWORD dwFlags,
SIZE_T dwBytes
);
hHeap 는 프로 세 스 메모리 의 시작 위치 입 니 다.dwFlags 는 메모리 할당 의 표지 입 니 다.HEAP 포함ZERO_MEMORY, 분 배 된 공간 이 없어 도.dwBytes 는 메모리 의 크기 를 분배 합 니 다.그 에 대응 하 는 방출 공간 함 수 는 HeapFree 입 니 다.
2. GlobalAlloc 다시 보기: 이 함 수 는 전역 더미 에서 메모리 공급 프로그램 을 할당 하 는 데 사 용 됩 니 다. 함수 원형 은:
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
uFlags 매개 변수 의미 GHND GMEMMOVEABLE 와 GMEMZEROINIT 의 조합 GMEMFIXED 고정 메모리 할당, 반환 값 은 포인터 GMEMMOVEABLE 는 이벤트 메모 리 를 할당 합 니 다. Win 32 에 서 는 메모리 블록 이 물리 적 메모리 에서 이동 할 수 없 지만 기본 더미 에서 이동 할 수 있 습 니 다.반환 값 은 메모리 대상 의 핸들 입 니 다. 함수 GlobalLock 으로 핸들 을 포인터 GMEM 로 변환 할 수 있 습 니 다.ZEROINIT 메모리 내용 0 GPTR GMEM 로 초기 화FIXED 와 GMEMZEROINIT 의 조합 은 일반적인 상황 에서 우리 가 프로 그래 밍 을 할 때 응용 프로그램 에 분 배 된 메모리 가 이동 할 수 있 거나 버 릴 수 있 습 니 다. 그러면 유한 한 메모리 자원 을 충분히 이용 할 수 있 기 때문에 어느 때 우리 가 분배 한 메모리 의 주 소 는 확실 하지 않 습 니 다. 그 는 이동 할 수 있 기 때문에 먼저 그 메모리 블록 을 잠 가 야 합 니 다.이 프로그램 은 구문 을 잠 그 기 위해 API 함수 GlobalLock 함 수 를 호출 해 야 합 니 다.lpMem = GlobalLock (hMem);이렇게 해야만 응용 프로그램 이 이 메모리 에 액세스 할 수 있다.그래서 우 리 는 GlobalAllock 을 사용 할 때 보통 GlobalLock 을 사용 합 니 다. 물론 메모 리 를 사용 하지 않 을 때 GlobalUnlock 을 사용 해 야 합 니 다. 그렇지 않 으 면 잠 겨 있 는 메모리 블록 은 다른 변수 에 의 해 사용 되 지 않 습 니 다.GlobalAlloc 에 대응 하 는 방출 공간의 함 수 는 GlobalFree 입 니 다.
3. LocalAlloc: 이 함 수 는 국부 더미 에서 메모리 공급 프로그램 을 분배 하 는 데 사 용 됩 니 다. 함수 원형 은 다음 과 같 습 니 다.
HLOCAL LocalAlloc(
UINT uFlags,
SIZE_T uBytes
);
인자 가 GlobalAlloc 와 같 습 니 다.16 비트 윈도 우즈 에 서 는 차이 가 있 습 니 다. 16 비트 윈도 우즈 에 서 는 전역 더미 와 국부 더미 로 메모 리 를 관리 하기 때 문 입 니 다. 모든 응용 프로그램 이나 dll 이 메모 리 를 불 러 올 때 코드 세그먼트 가 전역 더미 에 불 러 오고 시스템 은 모든 인 스 턴 스 에 64kb 의 데이터 세그먼트 를 이 인 스 턴 스 의 부분 더미 로 할당 하여 응용 프로그램의 스 택 과 모든 전역 또는 정적 변 수 를 저장 합 니 다.LocalAlloc / GlobalAlloc 는 각각 국부 더미 나 전역 더미 에서 메모 리 를 분배 하 는 데 사용 된다.모든 프로 세 스 의 부분 적 인 더미 가 매우 작 기 때문에 부분 적 인 더미 에서 메모 리 를 분배 하 는 것 은 공간의 제한 을 받는다.그러나 이 더 미 는 모든 프로 세 스 의 개인 적 인 것 으로 상대 적 으로 데 이 터 를 분배 하 는 것 이 안전 하고 데이터 접근 오류 가 전체 시스템 에 영향 을 주지 않 습 니 다.전역 적 으로 분 배 된 메모 리 는 각 프로 세 스 를 위해 공 유 됩 니 다. 모든 프로 세 스 는 이 메모리 블록 의 핸들 만 있 으 면 이 메모리 에 접근 할 수 있 지만 모든 전역 메모리 공간 은 추가 메모리 비용 이 필요 하여 분배 낭 비 를 초래 합 니 다.그리고 심각 한 오류 가 발생 하면 전체 시스템 의 안정 에 영향 을 줄 수 있다.그러나 Win 32 에 서 는 모든 프로 세 스 가 부족 한 개인 더 미 를 가지 고 있 습 니 다. 현재 프로 세 스 에 만 접근 할 수 있 습 니 다.응용 프로그램 도 시스템 메모리 에 직접 접근 할 수 없다.그래서 Win 32 에서 전체 더미 와 부분 더 미 는 프로 세 스 의 부족 한 더 미 를 가리 키 고 있 습 니 다.LocalAlloc / GlobalAlloc 로 메모 리 를 분배 하 는 것 은 아무런 차이 가 없습니다.심지어 Local Alloc 에서 분 배 된 메모 리 는 GlobalFree 에서 방출 될 수 있다.따라서 Win 32 에서 프로 그래 밍 을 할 때 Local 과 Global 의 차 이 를 주의 할 필요 가 없습니다. 일반적인 메모리 분 배 는 모두 HeapAlloc (GetProcessHeap (),...) 와 같 습 니 다.LocalAlloc 에 대응 하 는 방출 함 수 는 LockFree 입 니 다.
4. VirtualAlloc: 이 함수 의 기능 은 프로 세 스 의 가상 주소 공간 을 호출 하여 일부 페이지 를 예약 하거나 제출 하 는 것 입 니 다. 메모리 할당 에 사용 할 경우 할당 형식 이 지정 되 지 않 은 MEMRESET, 시스템 은 자동 으로 0 으로 설정 합 니 다.함수 원형:
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize, // size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
VirtualAlloc 는 한 영역 을 제출 하 는 부분 이나 전 부 를 병렬 로 여러 번 호출 하여 큰 메모리 영역 을 유지 할 수 있 습 니 다.다 중 호출 이 같은 영역 을 제출 하 는 데 실 패 를 일 으 키 지 않 습 니 다.이것 은 프로그램 이 메모 리 를 저장 한 후에 쓰 일 페이지 를 마음대로 제출 할 수 있 게 한다.이 방식 이 유효 하지 않 을 때, 프로그램 이 보 존 된 페이지 의 상 태 를 검사 해서 호출 을 제출 하기 전에 제출 되 었 는 지 확인 합 니 다.VirtualAlloc 에 대응 하 는 방출 함 수 는 Virtual Free 입 니 다.
5. Malloc: malloc 와 free 는 C + + / C 언어의 표준 라 이브 러 리 함수 로 동적 메모리 신청 과 메모리 방출 에 사용 할 수 있 습 니 다.내부 데이터 형식 이 아 닌 대상 에 게 는 malloc / freee 만 으로 는 동적 대상 의 요 구 를 만족 시 킬 수 없습니다.대상 은 만 드 는 동시에 구조 함 수 를 자동 으로 실행 하고 대상 은 사라 지기 전에 분석 함 수 를 자동 으로 실행 해 야 합 니 다.malloc / freee 는 연산 자가 아 닌 라 이브 러 리 함수 이기 때문에 컴 파 일 러 제어 권한 내 에 있 지 않 기 때문에 구조 함수 와 분석 함 수 를 실행 하 는 임 무 를 malloc / freee 에 강요 할 수 없습니다.
6. New: new / delete 는 C + + 의 연산 자 입 니 다.동적 메모리 신청 과 메모리 방출 에 사용 할 수 있 습 니 다.C + + 언어 는 동적 메모리 할당 과 초기 화 작업 을 완료 할 수 있 는 연산 자 new 가 필요 합 니 다. 메모리 정리 와 방출 작업 을 완료 할 수 있 는 연산 자 delete 가 필요 합 니 다.new / delete 는 라 이브 러 리 함수 가 아 닙 니 다.C + + 프로그램 은 항상 C 함 수 를 호출 하고 C 프로그램 은 malloc / freee 로 만 동적 메모 리 를 관리 할 수 있 습 니 다.new 는 연산 자 입 니 다. "+", "-", "=" 과 같은 위치 에 있 습 니 다. malloc 는 메모리 할당 함수 로 호출 할 수 있 습 니 다. new 는 글 자 를 유지 하고 헤더 파일 지원 이 필요 없습니다. malloc 는 헤더 파일 라 이브 러 리 함수 지원 이 필요 합 니 다. new 는 하나의 대상 을 만 들 었 습 니 다. malloc 는 하나의 메모리 로 나 누 어 졌 습 니 다. new 가 만 든 대상 은 일반적인 대상 으로 생각 하고 구성원 함수 로 접근 할 수 있 습 니 다.주소 공간 에 직접 접근 하지 마 십시오. malloc 는 메모리 영역 을 할당 합 니 다. 포인터 로 접근 하 십시오. 또한 안에서 지침 을 이동 할 수 있 습 니 다. 메모리 누 출 은 malloc 나 new 에 대해 모두 검사 할 수 있 습 니 다. new 는 그 파일 의 줄 을 가리 킬 수 있 지만 malloc 는 이러한 정보 가 없습니다.new 는 malloc 플러스 구조 함수 의 실행 이 라 고 볼 수 있 습 니 다.new 에서 나 온 지침 은 직접 유형 정 보 를 가지 고 있 습 니 다.malloc 가 돌아 오 는 것 은 모두 void 지침 입 니 다.
VirtualAlloc 는 1PAGE 이상 의 RAM 을 한 번 에 할당 합 니 다. 매번 할당 할 때마다 PAGE 의 정수 배 입 니 다. BYTE 의 공간 을 1 개 할당 하기 위해 남 은 4095 바이트 를 낭비 하고 싶 지 않 습 니 다. OK, 알고리즘 을 작성 하여 몇 개의 PAGE 를 더 할당 할 수 있 습 니 다. 그리고 소량의 데 이 터 를 할당 할 때마다 그 몇 개의 PAGE 에서 구분 합 니 다. KERNEL 32 는 해결 방법 을 제공 합 니 다.HeapAlloc / GlobalAlloc 로 RAM 을 분배 합 니 다. 그러면 KERNEL 32 는 분배 동작 을 완성 하 는 데 도움 을 주 고 빈 영역 과 사용 한 영역 을 추적 하 는 데 소모 되 는 데이터 구 조 를 최소 화 합 니 다.
옛날 에 도 WINDOWS 라 는 제품 이 있 었 습 니 다. 그 때 WINDOWS 는 16BIT 였 습 니 다. 주소 공간 이 좁 고 돈 이 부족 하 며 식량 표 와 고기 표 가 있어 야 받 을 수 있 었 습 니 다. GlobalAlloc 는 이미 돈 을 낸 성질 과 똑 같 습 니 다. GlobalAlloc 는 아직 부족 합 니 다. 가끔 GlocalLock 이 있어 야 당신 의 물건 을 확실히 얻 을 수 있 습 니 다. 그렇지 않 으 면 당신 의 지침 이 불법 이 고 충 공 될 수 있 습 니 다.당신 의 응용 프로그램 은 죽 을 것 입 니 다. 멀리 떨 어 졌 습 니 다. 나중에 OS 가 진화 되 었 습 니 다. 식량 과 육 류 를 취소 할 수 있다 고 생각 했 습 니 다. 하지만 당신 은 새 지 폐 를 써 야 합 니 다. 바로 HeapAlloc 입 니 다. 시장 에 있 는 RAM 수량 이 문제 가 없 으 면 HeapAlloc 는 문제 가 없습니다. 당신 의 HeapAlloc 는 문제 가 없 으 면 항상 물건 을 받 을 수 있 습 니 다. 하지만 2000 판 지폐 가 있다 고 말 할 수 는 없습니다. 그 80 판 은 바로 폐기 되 었 습 니 다.그럼 GlobalAlloc 도 계속 유 통 될 수 밖 에 없어 요. 언제 까지 유 통 될 지 는 아무 도 몰라요.
GlobalAlloc 와 LocalAlloc 는 모두 Windows 시스템 이 제공 하 는 메모리 배분 함수 입 니 다. 그들의 차 이 는 16BIT 코드 시대 에서 비롯 되 었 습 니 다. 그 때 는 서로 다른 프로 세 스 메모리 공간 이 없 었 습 니 다. GlobalAlloc 는 전체 적 이 고 공용 적 인 원 격 더미 에서 분 배 됩 니 다.LocalAlloc 는 작업 자체 의 가 까 운 더미 에서 분 배 됩 니 다. Win 32 플랫폼 에서 이 두 함 수 는 똑 같 습 니 다. 모두 프로 세 스 자체 의 메모리 공간 에서 분 배 됩 니 다. Lock 이후 의 결 과 는 일반 포인터 (32 비트 가 까 운 포인터) 입 니 다. new 와 그들의 차 이 는 너무 크다. C + + 의 구조 함수 와 이상 메커니즘 과 관련 이 있 기 때문이다. 일반 컴 파일 러 의 new 는 모두 malloc 로 메모 리 를 분배 한다. malloc 로 다른 두 함수 와 비교 하면 더욱 합 리 적 이 어야 한다. 일반 malloc 의 실현 은 시스템 의 더미 에서 분 배 된 것 이 아니 라 컴 파일 러 로 연 결 된 운영 창고 에서 스스로 관리 하 는 더미 에서 이 루어 진다.Win 32 플랫폼 의 개발 도구 의 컴 파일 결과 에 서 는 보통 HeapCreate 로 더 미 를 만 들 고, HeapAlloc 와 HeapRealloc 로 더 미 를 유지 하 는 공간 이 늘 어 나 며, 마지막 으로 HeapDestroy 로 더 미 를 삭제 합 니 다. malloc 로 할당 하고, free 로 방출 할 때 는 라 이브 러 리 의 코드 가 이 더미 에서 공간 을 분배 하고 이 더미 로 공간 을 반환 합 니 다.이 더미 의 데이터 구 조 를 유지 합 니 다. malloc 더미 의 관 리 는 실행 라 이브 러 리 에서 직접 관리 하기 때문에 정적 실행 라 이브 러 리 를 사용 할 때 한 DLL 에서 malloc 로 메모 리 를 할당 하고 다른 DLL 에서 free 로 풀 면 문제 가 발생 합 니 다. DLL 마다 실행 라 이브 러 리 코드 를 연결 하기 때 문 입 니 다.따라서 모두 자신의 부분 적 인 더미 가 있 습 니 다. free 로 풀 때 이 메모리 가 자신의 더미 에서 분 배 된 것 이 라 고 가정 하여 오류 가 발생 합 니 다. GlobalAlloc 와 LocalAlloc 를 통 해 분 배 된 메모리 에는 이 문제 가 존재 하지 않 습 니 다.
HeapCreate 는 이미 더 미 를 만 드 는 작업 을 완 료 했 습 니 다. HeapAlloc, HeapReAlloc, Heap Free 는 모두 이 더미 에서 할당 되 고 메모 리 를 방출 하 는 함수 입 니 다. 즉, Windows 시스템 은 사실 우리 에 게 자신의 부분 더 미 를 사용 하 는 완전한 작업 을 제 공 했 지만 지정 한 배분 전략 을 보 는 방법 이 없습니다. 컴 파 일 러 가 제공 하 는 소스 코드 를 보면,VC 의 malloc, realloc, free 등 함수 의 주요 기능 은 바로 이 몇 개의 API 함수 로 이 루어 진 것 입 니 다. BC 의 실현 은 상당히 복잡 합 니 다. 마치 자신의 논 리 를 유지 한 것 같 습 니 다. BC 의 메모리 배분 이 VC 보다 빠르다 고 하 는데 아마도 이 때 문 일 것 입 니 다.
주: 참고 문헌:http://hi.baidu.com/shaobozuo/blog/item/050429e8ddd3e8fcce1b3e22.html
http://blog.csdn.net/g5dsk/article/details/6077601
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.