32 FILL_AllocStack = 0xCC,
37 FILL_AlignTail = 0xBD,
39 FILL_AlignTail = 0xED,
41 FILL_UnusedStack = 0xFE,
45 static const size_t k_ALLOC_MAX = 0x1000000;
49 static size_t sm_nAllocTotalBytes;
52 static UINT64
GRAYCALL get_PhysTotal();
53 static UINT64
GRAYCALL get_PhysAvail();
55 static void GRAYCALL Init(
int nFlags = 0);
57 static size_t GRAYCALL GetSize(
const void* pData) noexcept;
58 static bool GRAYCALL IsValidHeap(
const void* pData) noexcept;
66 return !IsValidHeap(pData);
68 static bool GRAYCALL IsValidInside(
const void* pData, ptrdiff_t
index) noexcept;
70 static void*
GRAYCALL AllocPtr(
size_t nSize);
72 static inline void*
AllocPtr(
size_t nSize,
const void* pDataInit)
75 void* pData = AllocPtr(nSize);
76 if (pData !=
nullptr && pDataInit !=
nullptr)
82 static void GRAYCALL FreePtr(
void* pData);
83 static void*
GRAYCALL ReAllocPtr(
void* pData,
size_t nSize);
97 #if defined(_MSC_VER) && (_MSC_VER >= 1300)
98 static const size_t k_SizeGap = 4;
99 static const size_t k_SizeAlignMax = 128;
109 BYTE m_TailGap[k_SizeGap];
114 static const cHeapHeader*
GRAYCALL GetHeader(
const void* pData) noexcept;
116 static bool GRAYCALL IsAlignedAlloc(
const void* pData,
size_t iAligned) noexcept;
117 static bool GRAYCALL IsValidHeap(
const void* pData) noexcept;
118 static size_t GRAYCALL GetSize(
const void* pData) noexcept;
119 static bool GRAYCALL IsValidInside(
const void* pData, INT_PTR
index) noexcept;
121 static void*
GRAYCALL AllocPtr(
size_t nSize,
size_t iAligned);
122 static void GRAYCALL FreePtr(
void* pData);
132 return SUPER_t::IsValidHeap(pData);
134 static inline size_t GetSize(
const void* pData) noexcept
136 return SUPER_t::GetSize(pData);
140 return SUPER_t::IsValidInside(pData,
index);
143 static inline void*
AllocPtr(
size_t nSize,
size_t iAligned)
145 return SUPER_t::AllocPtr(nSize);
149 return SUPER_t::FreePtr(pData);
185 m_pData = ref.m_pData; ref.m_pData =
nullptr;
186 m_nSize = ref.m_nSize; ref.m_nSize = 0;
196 Alloc(pDataCopy, nSize);
212 m_pData = ref.
m_pData; ref.m_pData =
nullptr;
213 m_nSize = ref.m_nSize; ref.m_nSize = 0;
247 return get_AllocSize();
298 bool Alloc(
const void* pData,
size_t nSize)
302 ASSERT(pData ==
nullptr || !this->IsValidPtr(pData));
307 if (pData !=
nullptr)
317 if (nSize != m_nSize)
320 if (nSize > 0 && !isValidPtr())
330 ASSERT(pData ==
nullptr || !this->IsValidPtr(pData));
335 if (pData !=
nullptr)
346 if (iSizeNew > m_nSize && iSizeNew > get_AllocSize())
348 if (!ReAlloc(iSizeNew))
376 return (BYTE*)get_Data();
381 return (
char*)get_Data();
386 return (
wchar_t*)get_Data();
389 operator void* ()
const noexcept
393 operator BYTE* ()
const noexcept
395 return get_DataBytes();
397 operator char* ()
const noexcept
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define CATTR_PACKED
Definition: GrayCore.h:87
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define DEBUG_CHECK(exp)
Definition: cDebugAssert.h:90
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
bool isValidRead() const noexcept
Definition: cHeap.h:217
size_t GetHeapStats(OUT ITERATE_t &iAllocCount) const
Definition: cHeap.h:241
bool ReAllocLazy(size_t iSizeNew)
Definition: cHeap.h:342
wchar_t * get_DataW() const noexcept
Definition: cHeap.h:383
cHeapBlock(const THIS_t &ref)
Definition: cHeap.h:177
bool Alloc(size_t nSize)
Definition: cHeap.h:277
cHeapBlock() noexcept
Definition: cHeap.h:172
char * get_DataA() const noexcept
Definition: cHeap.h:378
cHeapBlock(THIS_t &&ref) noexcept
Definition: cHeap.h:182
bool isCorrupt() const noexcept
Definition: cHeap.h:225
void * get_Data() const noexcept
Definition: cHeap.h:363
bool ReAlloc(const void *pData, size_t nSize)
Definition: cHeap.h:328
cHeapBlock(size_t nSize)
Definition: cHeap.h:188
BYTE * get_DataBytes() const noexcept
Definition: cHeap.h:372
void Free()
Definition: cHeap.h:249
cHeapBlock(const void *pDataCopy, size_t nSize)
Definition: cHeap.h:193
bool Alloc(const void *pData, size_t nSize)
Definition: cHeap.h:298
bool ReAlloc(size_t nSize)
Definition: cHeap.h:313
void FreeSecure()
Definition: cHeap.h:256
void SetHeapBlock(void *pData, size_t nSize)
Definition: cHeap.h:265
bool SetCopy(const cHeapBlock &rSrc)
Definition: cHeap.h:355
~cHeapBlock()
Definition: cHeap.h:198
void DetachHeapBlock()
Definition: cHeap.h:272
size_t get_AllocSize() const
Definition: cHeap.h:233
void * m_pData
Definition: cMem.h:318
size_t get_DataSize() const noexcept
Definition: cMem.h:344
size_t m_nSize
size_t of m_pData in bytes. May be determined at runtime.
Definition: cMem.h:317
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int ITERATE_t
like size_t but signed
Definition: Index.h:28
uint16 index
Definition: sample3.cpp:29
static bool IsValidInside(const void *pData, INT_PTR index) noexcept
Definition: cHeap.h:138
static bool IsValidHeap(const void *pData) noexcept
Definition: cHeap.h:130
static void FreePtr(void *pData)
Definition: cHeap.h:147
static bool IsAlignedAlloc(const void *pData, size_t iAligned) noexcept
Definition: cHeap.h:126
static size_t GetSize(const void *pData) noexcept
Definition: cHeap.h:134
static void * AllocPtr(size_t nSize, size_t iAligned)
Definition: cHeap.h:143
cHeap SUPER_t
Definition: cHeap.h:95
static void *__stdcall ReAllocPtr(void *pData, size_t nSize)
Definition: cHeap.cpp:158
static void *__stdcall AllocPtr(size_t nSize)
Definition: cHeap.cpp:125
static void * AllocPtr(size_t nSize, const void *pDataInit)
Definition: cHeap.h:72
static void __stdcall FreePtr(void *pData)
Definition: cHeap.cpp:103
static bool IsCorruptHeap(const void *pData) noexcept
Definition: cHeap.h:60
static bool __stdcall IsValidHeap(const void *pData) noexcept
Definition: cHeap.cpp:245
static ITERATE_t sm_nAllocs
count total allocations (i.e. Number of calls to malloc() minus calls to free())
Definition: cHeap.h:47
static size_t __stdcall GetSize(const void *pData) noexcept
Definition: cHeap.cpp:226
FILL_TYPE
Definition: cHeap.h:29
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132
static void ZeroSecure(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:110