PrivateHeap.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 2.3.15
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. /******************************************************************************
  25. Module: PrivateHeap.h
  26. Notices: Copyright (c) 2006 Bruce Liang
  27. Purpose: 管理进程私有堆.
  28. Desc:
  29. 1. CPrivateHeap: 自动创建和销毁进程私有堆
  30. 每一个该类的对象都代表一个私有堆, 所以
  31. 该类对象的特点是: 一般声明周期都比较长
  32. 通常作为全局对象, 其他类的静态成员对象
  33. 或者一些长生命周期类对象的成员对象
  34. 2. CPrivateHeapBuffer: 在私有堆中自动分配和释放指定大小的内存
  35. 一般用于在函数体内分配和释放局部作用域的堆内存
  36. 从而避免对 CPrivateHeap::Alloc() 和
  37. CPrivateHeap::Free() 的调用
  38. Examples:
  39. CPrivateHeap g_hpPrivate;
  40. int _tmain(int argc, _TCHAR* argv[])
  41. {
  42. CPrivateHeapStrBuffer buff(g_hpPrivate, 32);
  43. lstrcpy(buff, _T("失败乃成功之母"));
  44. SIZE_T size = buff.Size();
  45. buff.ReAlloc(40);
  46. size = buff.Size();
  47. std::cout << (TCHAR*)buff << '\n';
  48. // OR
  49. // ASSERT(g_hpPrivate.IsValid());
  50. // TCHAR* pch = (TCHAR*)g_hpPrivate.Alloc(32 * sizeof(TCHAR));
  51. // lstrcpy(pch, _T("失败乃成功之母"));
  52. // SIZE_T size = g_hpPrivate.Size(pch);
  53. // g_hpPrivate.ReAlloc(pch, 40 * sizeof(TCHAR));
  54. // size = g_hpPrivate.Size(pch);
  55. // std::cout << pch << '\n';
  56. // g_hpPrivate.Free(pch);
  57. //
  58. return 0;
  59. }
  60. ******************************************************************************/
  61. #pragma once
  62. class CPrivateHeapImpl
  63. {
  64. public:
  65. PVOID Alloc(SIZE_T dwSize, DWORD dwFlags = 0)
  66. {return ::HeapAlloc(m_hHeap, dwFlags, dwSize);}
  67. PVOID ReAlloc(PVOID pvMemory, SIZE_T dwSize, DWORD dwFlags = 0)
  68. {return ::HeapReAlloc(m_hHeap, dwFlags, pvMemory, dwSize);}
  69. SIZE_T Size(PVOID pvMemory, DWORD dwFlags = 0)
  70. {return ::HeapSize(m_hHeap, dwFlags, pvMemory);}
  71. BOOL Free(PVOID pvMemory, DWORD dwFlags = 0)
  72. {return ::HeapFree(m_hHeap, dwFlags, pvMemory);}
  73. SIZE_T Compact(DWORD dwFlags = 0)
  74. {return ::HeapCompact(m_hHeap, dwFlags);}
  75. BOOL IsValid() {return m_hHeap != nullptr;}
  76. BOOL Reset()
  77. {
  78. if(IsValid()) ::HeapDestroy(m_hHeap);
  79. m_hHeap = ::HeapCreate(m_dwOptions, m_dwInitSize, m_dwMaxSize);
  80. return IsValid();
  81. }
  82. public:
  83. CPrivateHeapImpl(DWORD dwOptions = 0, SIZE_T dwInitSize = 0, SIZE_T dwMaxSize = 0)
  84. : m_dwOptions(dwOptions), m_dwInitSize(dwInitSize), m_dwMaxSize(dwMaxSize)
  85. {m_hHeap = ::HeapCreate(m_dwOptions, m_dwInitSize, m_dwMaxSize);}
  86. ~CPrivateHeapImpl () {if(IsValid()) ::HeapDestroy(m_hHeap);}
  87. operator HANDLE () {return m_hHeap;}
  88. private:
  89. CPrivateHeapImpl(const CPrivateHeapImpl&);
  90. CPrivateHeapImpl operator = (const CPrivateHeapImpl&);
  91. private:
  92. HANDLE m_hHeap;
  93. DWORD m_dwOptions;
  94. SIZE_T m_dwInitSize;
  95. SIZE_T m_dwMaxSize;
  96. };
  97. class CGlobalHeapImpl
  98. {
  99. public:
  100. PVOID Alloc(SIZE_T dwSize, DWORD dwFlags = 0)
  101. {
  102. PVOID pv = malloc(dwSize);
  103. if(pv && (dwFlags | HEAP_ZERO_MEMORY))
  104. ZeroMemory(pv, dwSize);
  105. return pv;
  106. }
  107. PVOID ReAlloc(PVOID pvMemory, SIZE_T dwSize, DWORD dwFlags = 0)
  108. {
  109. PVOID pv = realloc(pvMemory, dwSize);
  110. if(pv && (dwFlags | HEAP_ZERO_MEMORY))
  111. ZeroMemory(pv, dwSize);
  112. else if(!pv)
  113. free(pvMemory);
  114. return pv;
  115. }
  116. BOOL Free(PVOID pvMemory, DWORD dwFlags = 0)
  117. {
  118. if(pvMemory)
  119. {
  120. free(pvMemory);
  121. return TRUE;
  122. }
  123. return FALSE;
  124. }
  125. SIZE_T Compact (DWORD dwFlags = 0) {return -1;}
  126. SIZE_T Size (PVOID pvMemory, DWORD dwFlags = 0) {return _msize(pvMemory);}
  127. BOOL IsValid() {return TRUE;}
  128. BOOL Reset() {return TRUE;}
  129. public:
  130. CGlobalHeapImpl (DWORD dwOptions = 0, SIZE_T dwInitSize = 0, SIZE_T dwMaxSize = 0) {}
  131. ~CGlobalHeapImpl() {}
  132. operator HANDLE () {return nullptr;}
  133. private:
  134. CGlobalHeapImpl(const CGlobalHeapImpl&);
  135. CGlobalHeapImpl operator = (const CGlobalHeapImpl&);
  136. };
  137. #ifndef _NOT_USE_PRIVATE_HEAP
  138. typedef CPrivateHeapImpl CPrivateHeap;
  139. #else
  140. typedef CGlobalHeapImpl CPrivateHeap;
  141. #endif
  142. template<class T>
  143. class CPrivateHeapBuffer
  144. {
  145. public:
  146. CPrivateHeapBuffer(CPrivateHeap& hpPrivate,
  147. SIZE_T dwSize = 0,
  148. DWORD dwAllocFlags = 0,
  149. DWORD dwFreeFlags = 0)
  150. : m_hpPrivate(hpPrivate)
  151. , m_dwAllocFlags(dwAllocFlags)
  152. , m_dwFreeFlags(dwFreeFlags)
  153. , m_pvMemory(nullptr)
  154. {
  155. ASSERT(m_hpPrivate.IsValid());
  156. Alloc(dwSize);
  157. }
  158. ~CPrivateHeapBuffer() {Free();}
  159. public:
  160. T* Alloc(SIZE_T dwSize)
  161. {
  162. if(IsValid())
  163. Free();
  164. return m_pvMemory = (T*)m_hpPrivate.Alloc(dwSize * sizeof(T), m_dwAllocFlags);
  165. }
  166. T* ReAlloc(SIZE_T dwSize, DWORD dwFlags = 0)
  167. {return m_pvMemory = (T*)m_hpPrivate.ReAlloc(m_pvMemory, dwSize * sizeof(T), dwFlags);}
  168. SIZE_T Size(DWORD dwFlags = 0)
  169. {return m_hpPrivate.Size(m_pvMemory, dwFlags);}
  170. BOOL Free()
  171. {
  172. BOOL isOK = TRUE;
  173. if(IsValid())
  174. {
  175. isOK = m_hpPrivate.Free(m_pvMemory, m_dwFreeFlags);
  176. m_pvMemory = nullptr;
  177. }
  178. return isOK;
  179. }
  180. BOOL IsValid() {return m_pvMemory != nullptr;}
  181. operator T* () const {return m_pvMemory;}
  182. private:
  183. CPrivateHeapBuffer(const CPrivateHeapBuffer&);
  184. CPrivateHeapBuffer operator = (const CPrivateHeapBuffer&);
  185. private:
  186. CPrivateHeap& m_hpPrivate;
  187. T* m_pvMemory;
  188. DWORD m_dwAllocFlags;
  189. DWORD m_dwFreeFlags;
  190. };
  191. typedef CPrivateHeapBuffer<BYTE> CPrivateHeapByteBuffer;
  192. typedef CPrivateHeapBuffer<TCHAR> CPrivateHeapStrBuffer;