ReactOS  0.4.12-dev-51-ge94618b
__debug_alloc< _Alloc > Class Template Reference

#include <_alloc.h>

Inheritance diagram for __debug_alloc< _Alloc >:
Collaboration diagram for __debug_alloc< _Alloc >:

Classes

struct  __alloc_header
 

Public Types

typedef _Alloc __allocator_type
 
typedef _Alloc::value_type value_type
 

Public Member Functions

 __debug_alloc ()
 
 ~__debug_alloc ()
 

Static Public Member Functions

static void *_STLP_CALL allocate (size_t)
 
static void _STLP_CALL deallocate (void *, size_t)
 

Private Types

enum  { __pad = 8, __magic = 0xdeba, __deleted_magic = 0xdebd, __shred_byte = _STLP_SHRED_BYTE }
 
enum  { __extra_before = 16, __extra_after = 8 }
 

Static Private Member Functions

static size_t _STLP_CALL __extra_before_chunk ()
 
static size_t _STLP_CALL __extra_after_chunk ()
 

Detailed Description

template<class _Alloc>
class __debug_alloc< _Alloc >

Definition at line 104 of file _alloc.h.

Member Typedef Documentation

◆ __allocator_type

template<class _Alloc >
typedef _Alloc __debug_alloc< _Alloc >::__allocator_type

Definition at line 106 of file _alloc.h.

◆ value_type

template<class _Alloc >
typedef _Alloc::value_type __debug_alloc< _Alloc >::value_type

Definition at line 107 of file _alloc.h.

Member Enumeration Documentation

◆ anonymous enum

template<class _Alloc >
anonymous enum
private
Enumerator
__pad 
__magic 
__deleted_magic 
__shred_byte 

Definition at line 115 of file _alloc.h.

◆ anonymous enum

template<class _Alloc >
anonymous enum
private
Enumerator
__extra_before 
__extra_after 

Definition at line 118 of file _alloc.h.

Constructor & Destructor Documentation

◆ __debug_alloc()

template<class _Alloc >
__debug_alloc< _Alloc >::__debug_alloc ( )
inline

Definition at line 131 of file _alloc.h.

131 {}

◆ ~__debug_alloc()

template<class _Alloc >
__debug_alloc< _Alloc >::~__debug_alloc ( )
inline

Definition at line 132 of file _alloc.h.

132 {}

Member Function Documentation

◆ __extra_after_chunk()

template<class _Alloc >
static size_t _STLP_CALL __debug_alloc< _Alloc >::__extra_after_chunk ( )
inlinestaticprivate

Definition at line 126 of file _alloc.h.

126  {
127  return (long)__extra_after / sizeof(value_type) +
128  (size_t)((long)__extra_after % sizeof(value_type) > 0);
129  }
unsigned long
Definition: typeof.h:99
_Alloc::value_type value_type
Definition: _alloc.h:107
value_type
Definition: get.c:76

◆ __extra_before_chunk()

template<class _Alloc >
static size_t _STLP_CALL __debug_alloc< _Alloc >::__extra_before_chunk ( )
inlinestaticprivate

Definition at line 122 of file _alloc.h.

122  {
123  return (long)__extra_before / sizeof(value_type) +
124  (size_t)((long)__extra_before % sizeof(value_type) > 0);
125  }
unsigned long
Definition: typeof.h:99
_Alloc::value_type value_type
Definition: _alloc.h:107
value_type
Definition: get.c:76

◆ allocate()

template<class _Alloc >
_STLP_BEGIN_NAMESPACE void *_STLP_CALL __debug_alloc< _Alloc >::allocate ( size_t  __n)
static

Definition at line 38 of file _alloc.c.

38  {
39  size_t __total_extra = __extra_before_chunk() + __extra_after_chunk();
40  size_t __real_n = __n + __total_extra;
41  if (__real_n < __n) {
42  //It means that we rolled on size_t, __n must be very large:
44  }
45  __alloc_header *__result = (__alloc_header *)__allocator_type::allocate(__real_n);
46  memset((char*)__result, __shred_byte, __real_n * sizeof(value_type));
47  __result->__magic = __magic;
48  __result->__type_size = sizeof(value_type);
49  __result->_M_size = (_STLP_UINT32_T)__n;
50  return ((char*)__result) + (long)__extra_before;
51 }
return __n
Definition: _algo.h:75
#define _STLP_UINT32_T
Definition: _apple.h:37
_Alloc::value_type value_type
Definition: _alloc.h:107
static size_t _STLP_CALL __extra_before_chunk()
Definition: _alloc.h:122
value_type
Definition: get.c:76
#define memset(x, y, z)
Definition: compat.h:39
#define _STLP_THROW_BAD_ALLOC
Definition: _new.h:116
static size_t _STLP_CALL __extra_after_chunk()
Definition: _alloc.h:126

◆ deallocate()

template<class _Alloc >
void _STLP_CALL __debug_alloc< _Alloc >::deallocate ( void __p,
size_t  __n 
)
static

Definition at line 55 of file _alloc.c.

55  {
56  __alloc_header * __real_p = (__alloc_header*)((char *)__p -(long)__extra_before);
57  // check integrity
58  _STLP_VERBOSE_ASSERT(__real_p->__magic != __deleted_magic, _StlMsg_DBA_DELETED_TWICE)
59  _STLP_VERBOSE_ASSERT(__real_p->__magic == __magic, _StlMsg_DBA_NEVER_ALLOCATED)
60  _STLP_VERBOSE_ASSERT(__real_p->__type_size == 1,_StlMsg_DBA_TYPE_MISMATCH)
61  _STLP_VERBOSE_ASSERT(__real_p->_M_size == __n, _StlMsg_DBA_SIZE_MISMATCH)
62  // check pads on both sides
63  unsigned char* __tmp;
64  for (__tmp = (unsigned char*)(__real_p + 1); __tmp < (unsigned char*)__p; ++__tmp) {
65  _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_UNDERRUN)
66  }
67 
68  size_t __real_n = __n + __extra_before_chunk() + __extra_after_chunk();
69 
70  for (__tmp= ((unsigned char*)__p) + __n * sizeof(value_type);
71  __tmp < ((unsigned char*)__real_p) + __real_n ; ++__tmp) {
72  _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_OVERRUN)
73  }
74 
75  // that may be unfortunate, just in case
76  __real_p->__magic = __deleted_magic;
77  memset((char*)__p, __shred_byte, __n * sizeof(value_type));
78  __allocator_type::deallocate(__real_p, __real_n);
79 }
return __n
Definition: _algo.h:75
unsigned long
Definition: typeof.h:99
static size_t _STLP_CALL __extra_before_chunk()
Definition: _alloc.h:122
value_type
Definition: get.c:76
#define memset(x, y, z)
Definition: compat.h:39
#define _STLP_VERBOSE_ASSERT(expr, diagnostic)
Definition: _debug.h:439
static size_t _STLP_CALL __extra_after_chunk()
Definition: _alloc.h:126

The documentation for this class was generated from the following files: