124 lines
3.0 KiB
C++
124 lines
3.0 KiB
C++
/*
|
|
* =====================================================================================
|
|
*
|
|
* Filename: memcheck.h
|
|
*
|
|
* Description: memcheck class definition.
|
|
*
|
|
* Version: 1.0
|
|
* Created: 09/08/2018
|
|
* Revision: none
|
|
* Compiler: gcc
|
|
*
|
|
* Author: zhulin, shzhulin3@jd.com
|
|
* Company: JD.com, Inc.
|
|
*
|
|
* =====================================================================================
|
|
*/
|
|
|
|
#ifndef __H_MEMCHEC____
|
|
#define __H_MEMCHEC____
|
|
|
|
#include <malloc.h>
|
|
|
|
#if MEMCHECK
|
|
#define MALLOC(x) malloc_debug(x, __FILE__, __LINE__)
|
|
#define FREE(x) free_debug(x, __FILE__, __LINE__)
|
|
#define FREE_IF(x) do { if((x) != 0) free_debug((void *)(x), __FILE__, __LINE__); } while(0)
|
|
#define FREE_CLEAR(x) do { if((x) != 0) { free_debug((void *)(x), __FILE__, __LINE__); (x)=0; } } while(0)
|
|
#define REALLOC(p,sz) ({ void *a=realloc_debug(p,sz, __FILE__, __LINE__); if(a) p = (typeof(p))a; a; })
|
|
#define CALLOC(x,y) calloc_debug(x, y, __FILE__, __LINE__)
|
|
#define STRDUP(x) strdup_debug(x, __FILE__, __LINE__)
|
|
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern void *malloc_debug(size_t, const char *, int);
|
|
extern void free_debug(void *, const char *, int);
|
|
extern void *realloc_debug(void *, size_t, const char *, int);
|
|
extern void *calloc_debug(size_t, size_t, const char *, int);
|
|
extern char *strdup_debug(const char *, const char *, int);
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#else
|
|
#define MALLOC(x) malloc(x)
|
|
#define FREE(x) free(x)
|
|
#define FREE_IF(x) do { if((x) != 0) free((void *)(x)); } while(0)
|
|
#define FREE_CLEAR(x) do { if((x) != 0) { free((void *)(x)); (x)=0; } } while(0)
|
|
#define REALLOC(p,sz) ({ void *a=realloc(p,sz); if(a) p = (typeof(p))a; a; })
|
|
#define CALLOC(x, y) calloc(x, y)
|
|
#define STRDUP(x) strdup(x)
|
|
#endif
|
|
|
|
#if __cplusplus
|
|
|
|
#if MEMCHECK
|
|
extern void enable_memchecker(void);
|
|
extern void dump_non_delete(void);
|
|
extern void report_mallinfo(void);
|
|
extern unsigned long count_virtual_size(void);
|
|
extern unsigned long count_alloc_size(void);
|
|
#else
|
|
static inline void enable_memchecker(void) {}
|
|
static inline void dump_non_delete(void) {}
|
|
static inline void report_mallinfo(void) {}
|
|
#endif
|
|
|
|
#define NEW(type, pointer) \
|
|
do \
|
|
{ \
|
|
try \
|
|
{ \
|
|
pointer = 0; \
|
|
pointer = new type; \
|
|
} \
|
|
catch (...) \
|
|
{ \
|
|
pointer = 0; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define DELETE(pointer) \
|
|
do \
|
|
{ \
|
|
if(pointer) { \
|
|
delete pointer; \
|
|
pointer = 0; \
|
|
} \
|
|
} while(0)
|
|
|
|
#define DEC_DELETE(pointer) \
|
|
do \
|
|
{ \
|
|
if(pointer && pointer->DEC()==0) { \
|
|
delete pointer; \
|
|
pointer = 0; \
|
|
} \
|
|
} while(0)
|
|
|
|
#define NEW_ARRAY(n, type, pointer) \
|
|
do \
|
|
{ \
|
|
try \
|
|
{ \
|
|
pointer = 0; \
|
|
pointer = new type[n]; \
|
|
} \
|
|
catch (...) \
|
|
{ \
|
|
pointer = 0; \
|
|
} \
|
|
} while(0)
|
|
|
|
#define DELETE_ARRAY(pointer) \
|
|
do \
|
|
{ \
|
|
delete[] pointer; \
|
|
pointer = 0; \
|
|
} while(0)
|
|
|
|
#endif
|
|
|
|
#endif
|