Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

142 lines
3.4 KiB

// debug heap support header for Microsoft
#pragma once
#ifndef _XDEBUG_
#define _XDEBUG_
#pragma pack(push,8)
#pragma warning(push,3)
// SUPPORT FOR DEBUG HEAP
#if !defined(_DEBUG)
#define _NEW_CRT new
#define _DELETE_CRT(_P) delete (_P)
#define _DELETE_CRT_VEC(_P) delete[] (_P)
#define _STRING_CRT string
#else
#include <xmemory>
#include <xstring>
_STD_BEGIN
struct _DebugHeapTag_t
{ // placement new tag type to select debug CRT heap
int _Type;
};
extern _CRTIMP2 const _DebugHeapTag_t _DebugHeapTag;
_STD_END
_CRTIMP2 void * __cdecl
operator new(size_t, const std::_DebugHeapTag_t&, char *, int)
_THROW1(std::bad_alloc); // allocate from the debug CRT heap
_CRTIMP2 void * __cdecl
operator new[](size_t, const std::_DebugHeapTag_t&, char *, int)
_THROW1(std::bad_alloc); // allocate array from the debug CRT heap
_CRTIMP2 void __cdecl
operator delete(void *, const std::_DebugHeapTag_t&, char *, int)
_THROW0(); // delete if new for debug CRT heap fails
_CRTIMP2 void __cdecl
operator delete[](void *, const std::_DebugHeapTag_t&, char *, int)
_THROW0(); // delete if array new for debug CRT heap fails
#define _NEW_CRT new(std::_DebugHeapTag, __FILE__, __LINE__)
#define _DELETE_CRT(_P) std::_DebugHeapDelete(_P)
#define _DELETE_CRT_VEC(_P) std::_DebugHeapDelete((void *)_P)
#define _STRING_CRT _DebugHeapString
_STD_BEGIN
// TEMPLATE FUNCTION _DebugHeapDelete
template<class _Ty>
void _DebugHeapDelete(_Ty *_Ptr)
{ // delete from the debug CRT heap even if operator delete differs
if (_Ptr != 0)
{
_Ptr->~_Ty();
// delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
// facets allocated by normal new.
free(_Ptr);
}
}
// TEMPLATE CLASS _DebugHeapAllocator
template<class _Ty>
class _DebugHeapAllocator
: public allocator<_Ty>
{ // an allocator which uses the debug CRT heap
public:
template<class _Other>
struct rebind
{ // convert _DebugHeapAllocator<_Ty> to _DebugHeapAllocator<_Other>
typedef _DebugHeapAllocator<_Other> other;
};
template<class _Other>
pointer allocate(size_type _Count, const _Other *)
{ // allocate array of _Count elements, ignore hint
return (_Ty *)_NEW_CRT char[_Count * sizeof(_Ty)];
}
pointer allocate(size_type _Count)
{ // allocate array of _Count elements
return (_Ty *)_NEW_CRT char[_Count * sizeof(_Ty)];
}
void deallocate(pointer _Ptr, size_type)
{ // deallocate object at _Ptr, ignore size
_DELETE_CRT_VEC(_Ptr);
}
};
// CLASS _DebugHeapString
class _DebugHeapString
: public basic_string<char, char_traits<char>, _DebugHeapAllocator<char> >
{ // a version of std::string allocated on the debug CRT heap
public:
typedef _DebugHeapString _Myt;
typedef basic_string<char, char_traits<char>, _DebugHeapAllocator<char> >
_Mybase;
typedef char _Elem;
_DebugHeapString()
: _Mybase()
{ // construct empty string
}
_DebugHeapString(const _Myt& _Right)
: _Mybase(_Right)
{ // construct by copying _Right
}
_DebugHeapString(const _Elem *_Ptr)
: _Mybase(_Ptr)
{ // construct from [_Ptr, <null>)
}
_DebugHeapString(const string &_Str)
: _Mybase(_Str.c_str())
{ // construct from std::string
}
operator string() const
{
return string(c_str());
}
};
_STD_END
#endif /* _DEBUG */
#pragma warning(pop)
#pragma pack(pop)
#endif /* _XDEBUG_ */
/*
* Copyright (c) 1992-2001 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V3.10:0009 */