今日の謎

Visual Studio 2005にて。

01: #define _CRTDBG_MAP_ALLOC
02: #include <stdlib.h>
03: #include <crtdbg.h>
04: #define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__)
05: 
06: class A
07: {
08: };
09: 
10: class B
11: {
12: public:
13:   ~B() {}
14: };
15: 
16: void main(void)
17: {
18:   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
19:   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
20:   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
21: 
22:   delete [] new char[1];
23:   delete new char[1];
24: 
25:   delete [] new A[1];
26:   delete new A[1];
27: 
28:   delete [] new B[1];
29:   delete new B[1];
30: }

メモリリークが検出されるのは29行目のだけ。

T:\>cl /MDd /D_DEBUG zzz.cpp
T:\>zzz
Detected memory leaks!
Dumping objects ->
zzz.cpp(29) : {60} normal block at 0x00370F90, 5 bytes long.
 Data: <     > 01 00 00 00 CD
Object dump complete.
T:\>

もちろん正しいdeleteの使い方ではないので気にしない!