Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
HeapMemory.cpp
[詳解]
1// ----------------------------------------------------------------------------
6
7#include "pch.h"
8#include "HeapMemory.h"
9
10using namespace alt;
11
12// BasicMemory --------------------------------------------------------
13
14LPVOID BasicMemory::Allocate (SIZE_T bytes, DWORD dwFlags)
15{
16 LPVOID lpvMem = ::malloc (bytes);
17
18 if (lpvMem != NULL && dwFlags == MEM_ZERO) ZeroMemory (lpvMem, bytes);
19
20 return lpvMem;
21}
22
23LPVOID BasicMemory::Reallocate (LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags)
24{
25 size_t previousSize = _msize (lpvMem);
26 size_t currentSize = bytes;
27 LPBYTE lpbyNewMem = (LPBYTE)::realloc (lpvMem, bytes);
28 if (lpbyNewMem != NULL && currentSize > previousSize && dwFlags == MEM_ZERO)
29 ZeroMemory (&lpbyNewMem[previousSize], (currentSize - previousSize));
30
31 return lpbyNewMem;
32};
33
34BOOL BasicMemory::Free (LPVOID lpvMem)
35{
36 ::free (lpvMem);
37
38 return TRUE;
39};
40
41// HeapMemory ---------------------------------------------------------
42
44{
45 _hObject = INVALID_HANDLE_VALUE;
46
47 _iBoundary = sizeof (INT);
48 _bCreateHeap = FALSE;
49}
50
52{
53 if (_hObject != INVALID_HANDLE_VALUE) Close ();
54}
55
57 SIZE_T initialSize, SIZE_T maximumSize, DWORD dwOptions)
58{
59 // ここの丁寧な説明はMicrosoftのサイトの右クリック和訳です。
60
61 // initialSizeパラメーターが 0 の場合、関数は 1 ページをコミットします。
62 // 値は、システム・ページ・サイズの倍数に切り上げられます。
63
64 // maximumSize がゼロでない場合、ヒープ・サイズは固定されており、
65 // 最大サイズを超えて拡張することはできません。また、ヒープから
66 // 割り振ることができる最大のメモリー・ブロックは、
67 // 32 ビット・プロセスでは 512 KB よりわずかに小さく、
68 // 64 ビット・プロセスでは 1,024 KB よりわずかに小さくなります。
69 // より大きなブロックを割り振る要求は、ヒープの最大サイズがブロックを
70 // 収容するのに十分な大きさであっても失敗します。
71
72 // maximumSize が 0 の場合、ヒープのサイズが大きくなる可能性があります。
73 // ヒープのサイズは、使用可能なメモリによってのみ制限されます。
74 // 固定サイズのヒープの制限より大きいメモリー・ブロックを割り振る要求は、
75 // 自動的に失敗することはありません。代わりに、システムは VirtualAlloc 関数を
76 // 呼び出して、大きなブロックに必要なメモリを取得します。
77 // 大きなメモリ ブロックを割り当てる必要があるアプリケーションでは、
78 // maximumSize を 0 に設定する必要があります。
79
80 _bCreateHeap = true;
81
82 _hObject = ::HeapCreate (dwOptions, initialSize, maximumSize);
83
84 return _hObject == NULL ? FALSE : TRUE;
85}
86
88{
89 _hObject = ::GetProcessHeap ();
90 _bCreateHeap = false;
91
92 return _hObject == NULL ? FALSE : TRUE;
93}
94
96{
97 BOOL ret = TRUE;
98
99 if (_bCreateHeap)
100 {
101 _bCreateHeap = false;
102 ret = ::HeapDestroy (_hObject);
103 }
104
105 _hObject = INVALID_HANDLE_VALUE; // HeapのハンドルはCloseHandle()不要
106
107 return ret;
108}
109
110SIZE_T HeapMemory::Compact () const
111{
112 return ::HeapCompact (_hObject, 0);
113}
114
115LPVOID HeapMemory::Allocate (SIZE_T bytes, DWORD dwFlags)
116{
117 return ::HeapAlloc (_hObject, dwFlags, this->BoundarySize (bytes));
118}
119
120LPVOID HeapMemory::Reallocate (LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags)
121{
122 // HeapReAlloc()における、MEM_ZEROの振る舞いについて
123 //
124 // 再割り振り要求がより大きいサイズに対するものである場合、
125 // 元のサイズを超えるメモリーの追加領域はゼロに初期化されます。
126 // 元のサイズまでのメモリブロックの内容は影響を受けません。
127 return ::HeapReAlloc (_hObject, dwFlags, lpvMem, bytes);
128}
129
130BOOL HeapMemory::Free (LPVOID lpvMem)
131{
132 return ::HeapFree (_hObject, 0, lpvMem);
133}
134
135// private functions --------------------------------------------------
136
137SIZE_T HeapMemory::BoundarySize (SIZE_T bytes) const
138{
139 return _iBoundary + (bytes - (bytes & (_iBoundary - 1LL)));
140}
ヒープメモリに関するAPIを集約したクラス
#define MEM_ZERO
Definition: Memory.h:11
プリコンパイル済みヘッダー ファイルです。
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
Definition: HeapMemory.cpp:14
virtual LPVOID APIENTRY Reallocate(LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
取得メモリの拡大
Definition: HeapMemory.cpp:23
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
Definition: HeapMemory.cpp:34
HANDLE _hObject
ハンドルを使用するWindowsAPIで保持するHANDLE値
virtual BOOL APIENTRY Free(LPVOID lpvMem)
メモリの返却
Definition: HeapMemory.cpp:130
virtual LPVOID APIENTRY Allocate(SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
メモリの取得
Definition: HeapMemory.cpp:115
SIZE_T APIENTRY Compact() const
取得したヒープ領域の整理
Definition: HeapMemory.cpp:110
virtual LPVOID APIENTRY Reallocate(LPVOID lpvMem, SIZE_T bytes, DWORD dwFlags=MEM_ZERO)
取得メモリの拡大
Definition: HeapMemory.cpp:120
BOOL APIENTRY Create(SIZE_T initialSize=0, SIZE_T maximumSize=0, DWORD dwOptions=0)
ヒープ領域の取得
Definition: HeapMemory.cpp:56
APIENTRY ~HeapMemory()
デストラクタ
Definition: HeapMemory.cpp:51
SIZE_T APIENTRY BoundarySize(SIZE_T bytes) const
Definition: HeapMemory.cpp:137
APIENTRY HeapMemory()
コンストラクタ
Definition: HeapMemory.cpp:43
BOOL APIENTRY Close()
取得したヒープ領域の解放
Definition: HeapMemory.cpp:95
BOOL APIENTRY Open()
システムヒープ領域の取得
Definition: HeapMemory.cpp:87
Definition: DBLibrary.h:12