|
@@ -22,7 +22,7 @@ typedef struct malloc_info stb_leakcheck_malloc_info;
|
|
|
|
|
|
struct malloc_info
|
|
struct malloc_info
|
|
{
|
|
{
|
|
- char *file;
|
|
|
|
|
|
+ const char *file;
|
|
int line;
|
|
int line;
|
|
size_t size;
|
|
size_t size;
|
|
stb_leakcheck_malloc_info *next,*prev;
|
|
stb_leakcheck_malloc_info *next,*prev;
|
|
@@ -30,7 +30,7 @@ struct malloc_info
|
|
|
|
|
|
static stb_leakcheck_malloc_info *mi_head;
|
|
static stb_leakcheck_malloc_info *mi_head;
|
|
|
|
|
|
-void *stb_leakcheck_malloc(size_t sz, char *file, int line)
|
|
|
|
|
|
+void *stb_leakcheck_malloc(size_t sz, const char *file, int line)
|
|
{
|
|
{
|
|
stb_leakcheck_malloc_info *mi = (stb_leakcheck_malloc_info *) malloc(sz + sizeof(*mi));
|
|
stb_leakcheck_malloc_info *mi = (stb_leakcheck_malloc_info *) malloc(sz + sizeof(*mi));
|
|
if (mi == NULL) return mi;
|
|
if (mi == NULL) return mi;
|
|
@@ -62,7 +62,7 @@ void stb_leakcheck_free(void *ptr)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void *stb_leakcheck_realloc(void *ptr, size_t sz, char *file, int line)
|
|
|
|
|
|
+void *stb_leakcheck_realloc(void *ptr, size_t sz, const char *file, int line)
|
|
{
|
|
{
|
|
if (ptr == NULL) {
|
|
if (ptr == NULL) {
|
|
return stb_leakcheck_malloc(sz, file, line);
|
|
return stb_leakcheck_malloc(sz, file, line);
|
|
@@ -88,11 +88,30 @@ void *stb_leakcheck_realloc(void *ptr, size_t sz, char *file, int line)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void stblkck_internal_print(const char *reason, const char *file, int line, size_t size, void *ptr)
|
|
|
|
+{
|
|
|
|
+#if (defined(_MSC_VER) && _MSC_VER < 1900) /* 1900=VS 2015 */ || defined(__MINGW32__)
|
|
|
|
+ // Compilers that use the old MS C runtime library don't have %zd
|
|
|
|
+ // and the older ones don't even have %lld either... however, the old compilers
|
|
|
|
+ // without "long long" don't support 64-bit targets either, so here's the
|
|
|
|
+ // compromise:
|
|
|
|
+ #if defined(_MSC_VER) && _MSC_VER < 1400 // before VS 2005
|
|
|
|
+ printf("%-6s: %s (%4d): %8d bytes at %p\n", reason, file, line, (int)size, ptr);
|
|
|
|
+ #else
|
|
|
|
+ printf("%-6s: %s (%4d): %8lld bytes at %p\n", reason, file, line, (long long)size, ptr);
|
|
|
|
+ #endif
|
|
|
|
+#else
|
|
|
|
+ // Assume we have %zd on other targets.
|
|
|
|
+ printf("%-6s: %s (%4d): %zd bytes at %p\n", reason, file, line, size, ptr);
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
void stb_leakcheck_dumpmem(void)
|
|
void stb_leakcheck_dumpmem(void)
|
|
{
|
|
{
|
|
stb_leakcheck_malloc_info *mi = mi_head;
|
|
stb_leakcheck_malloc_info *mi = mi_head;
|
|
while (mi) {
|
|
while (mi) {
|
|
if ((ptrdiff_t) mi->size >= 0)
|
|
if ((ptrdiff_t) mi->size >= 0)
|
|
|
|
+ stblkck_internal_print("LEAKED", mi->file, mi->line, mi->size, mi+1);
|
|
printf("LEAKED: %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) mi->size, mi+1);
|
|
printf("LEAKED: %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) mi->size, mi+1);
|
|
mi = mi->next;
|
|
mi = mi->next;
|
|
}
|
|
}
|
|
@@ -100,6 +119,7 @@ void stb_leakcheck_dumpmem(void)
|
|
mi = mi_head;
|
|
mi = mi_head;
|
|
while (mi) {
|
|
while (mi) {
|
|
if ((ptrdiff_t) mi->size < 0)
|
|
if ((ptrdiff_t) mi->size < 0)
|
|
|
|
+ stblkck_internal_print("FREED", mi->file, mi->line, ~mi->size, mi+1);
|
|
printf("FREED : %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) ~mi->size, mi+1);
|
|
printf("FREED : %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) ~mi->size, mi+1);
|
|
mi = mi->next;
|
|
mi = mi->next;
|
|
}
|
|
}
|