TNB Library
TnbNewDebug.h
[詳解]
1#pragma once
26#if defined(_DEBUG) && !defined(_WIN32_WCE)
27
28
29
30#include "TnbNewPlacement.h"
31
32
33
34#include <malloc.h>
35#include <windows.h>
36#include <crtdbg.h>
37#include <new>
38#include <memory>
39#include <stdio.h>
40
41
42
43#ifndef _TnbDOXYGEN //Document作成用シンボル
44
45
46#if _MSC_VER < 1400
47 #define _TnbStrFmt sprintf
48#else
49 #define _TnbStrFmt sprintf_s
50#endif
51
52namespace TNB {
54namespace NEW {
55
56 // Hookアドレス
57 _declspec(selectany) _CRT_ALLOC_HOOK gpAllocHook = NULL;
58 // 自動チェッククラス
59 struct CCrtDbgAutoCheck
60 {
61 // コンストラクタ
62 CCrtDbgAutoCheck(void)
63 {
64 int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
65 tmpFlag |= _CRTDBG_LEAK_CHECK_DF; //終了時に LeakCheckを出力
66 _CrtSetDbgFlag(tmpFlag);
67 #ifdef _TnbNEW_Log_ON
68 if ( gpAllocHook == NULL )
69 {
70 //メモリ確保/解放処理時にコールされる関数指定。
71 gpAllocHook = _CrtSetAllocHook(MyAllocHook);
72 }
73 #endif
74 }
75 //メモリ確保/解放処理時にコールされる関数指定。
76 static int __cdecl MyAllocHook(int iAllocType, LPVOID P, size_t nSize,
77 int iBlockType, long lRequestNo, const unsigned char* lpszFile, int iLine)
78 {
79 if ( iAllocType == _HOOK_FREE && iBlockType == _NORMAL_BLOCK )
80 {
81 long* L = static_cast<long*>(P);
82 char buf[1024];
83 _TnbStrFmt(buf, "mem{%d} Free / addr=0x%08X / size=%d\n", L[-2], P, L[-4]);
84 ::OutputDebugStringA(buf);
85 }
86 return TRUE;
87 }
88 };
89
90 // メモリ確保
91 inline LPVOID MemAlloc(size_t nSize, LPCSTR lpszFileName, int nLine)
92 {
93 static TNB::NEW::CCrtDbgAutoCheck sAutoCheck;
94 LPVOID P = _malloc_dbg(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
95 #ifdef _TnbNEW_Log_ON
96 if ( P != NULL )
97 {
98 long lRequestNo = -1;
99 ::_CrtIsMemoryBlock(P, nSize, &lRequestNo, NULL, NULL);
100 char buf[1024];
101 _TnbStrFmt(buf, "%s(%d): mem{%d} alloc\n", lpszFileName, nLine, lRequestNo);
102 ::OutputDebugStringA(buf);
103 _TnbStrFmt(buf, "mem{%d} Alloc / addr=0x%08X / size=%d\n", lRequestNo, P, nSize);
104 ::OutputDebugStringA(buf);
105 }
106 else
107 {
108 char buf[1024];
109 _TnbStrFmt(buf, "%s(%d): mem.alloc error\n", lpszFileName, nLine);
110 ::OutputDebugStringA(buf);
111 }
112 #endif // _TnbNEW_Log_ON
113 if ( P == NULL )
114 {
115 _CrtDbgReport(_CRT_ERROR, lpszFileName, nLine, NULL, "メモリ確保に失敗しました。");
116 throw std::bad_alloc();
117 }
118 return P;
119 }
120};//NEW
121};//TNB
122
123
124
126inline LPVOID __cdecl operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
127{
128 return TNB::NEW::MemAlloc(nSize, lpszFileName, nLine);
129}
130
131
132
134inline void __cdecl operator delete(LPVOID P, LPCSTR lpszFileName, int nLine)
135{
136 _free_dbg(P, _NORMAL_BLOCK);
137}
138
139
140
141#ifndef DEBUG_NEW
142 #define DEBUG_NEW new(__FILE__, __LINE__)
143#endif
144#ifndef new
145 #define new DEBUG_NEW
146#endif
147#define malloc(SIZE) TNB::NEW::MemAlloc(SIZE, __FILE__, __LINE__)
148
149
150
151#endif //Document作成用シンボル
152
153
154
155#endif //_DEBUG
PlacementNew/Delete関係のヘッダ
TNB Library
Definition: TnbDoxyTitle.txt:2