home *** CD-ROM | disk | FTP | other *** search
- // ▌≥ε≥ ⌠αΘδ Σδ Ωε∞∩Φδ ≥ε≡α BCC5.5
- #include "safe_new.h"
- #undef new
-
- #include <windows.h>
- #include <memory>
-
- #if 1 // ┼±δΦ 1, ≥ε ∩α∞ ≥ⁿ ß≤Σσ≥ ∩≡εΓσ≡ ≥ⁿ±
-
- struct MemNode
- {
- MemNode * prev;
- MemNode * next;
- const char * file;
- int line;
- int size;
- };
-
- static MemNode start = { 0,0,0,0,0 };
- static int simple_counter = 0;
-
- struct Reporter
- {
- public:
- ~Reporter()
- {
- MemNode * curr = start.next;
-
- HANDLE hfile = CreateFile( "memory.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL );
- if( hfile != INVALID_HANDLE_VALUE )
- {
- DWORD read = 0;
- char head[] = " size | line | file\n---------+------+----------\n";
- WriteFile( hfile, head, strlen(head), &read, NULL );
- for( ; curr ; curr = curr->next )
- {
- char buff[1024];
- int bs = wsprintf( buff,"%8d |%5d | %s\n", curr->size, curr->line, curr->file );
- WriteFile( hfile, buff, bs, &read, NULL );
- }
- CloseHandle( hfile ); hfile = INVALID_HANDLE_VALUE;
- }
- }
- };
-
-
- static Reporter reporter;
-
- static void * our_alloc( size_t s, const char * file, int line )
- {
- void * mama = malloc( s + sizeof(MemNode) );
- if( mama == 0 )
- {
- throw std::bad_alloc();
- }
- ++simple_counter;
-
- char * chama = (char *)mama;
- MemNode * just = (MemNode *)mama;
-
- just->file = file;
- just->line = line;
- just->size = s;
-
- MemNode * next = start.next;
- just->next = next;
- if( next )
- next->prev = just;
-
- just->prev = &start;
- start.next = just;
-
- void * p = (void *)( chama + sizeof(MemNode) );
- return p;
- }
-
- void our_free( void * p, const char * file, int line )
- {
- if( p == 0 )
- return;
- --simple_counter;
- char * chama = (char *)p - sizeof(MemNode);
- void * mama = chama;
- MemNode * just = (MemNode *)mama;
-
- MemNode * prev = just->prev;
- MemNode * next = just->next;
-
- prev->next = next;
- if( next )
- next->prev = prev;
- free( mama );
- }
-
- void * __cdecl operator new( size_t s, const char * file, int line )
- {
- return our_alloc( s, file, line );
- }
-
- /*void __cdecl operator delete( void * p, const char * file, int line )
- {
- our_free( p, file, line );
- }*/
-
- void * __cdecl operator new( size_t s )
- {
- return operator new( s, "Runtime", 0 );
- }
-
- void __cdecl operator delete( void * p )
- {
- our_free( p, "Runtime", 0 );
- }
-
- #else
-
- void * __cdecl operator new( size_t s, const char * file, int line )
- {
- return operator new( s );
- }
-
- /*void __cdecl operator delete( void * p, const char * file, int line )
- {
- operator delete( p );
- }*/
-
- #endif
-
- void * __cdecl operator new[]( size_t s )
- {
- return operator new( s );
- }
-
- void __cdecl operator delete[]( void * p )
- {
- operator delete( p );
- }
-
- void * __cdecl operator new[]( size_t s, const char * file, int line )
- {
- return operator new( s, file, line );
- }
-
- /*void __cdecl operator delete[]( void * p, const char * file, int line )
- {
- operator delete( p, file, line );
- }*/
-