//***************************************************************//
//****************** try something like this ******************//
//***************************************************************//
#include <stdlib.h>
#include <stdio.h>
// define one of these
// define LINUX
#define MACOS
// #define WINDOWS
#if defined LINUX || defined WINDOWS
#include <malloc.h>
#endif
#ifdef MACOS
#include <malloc/malloc.h>
#endif
// prototypes
int freeable(void *ptr);
void safe_free(void *ptr, const char *function, int line);
inline int freeable(void *ptr)
{
size_t sz;
#ifdef MACOS
sz = malloc_size(ptr);
#endif
#ifdef LINUX
sz = malloc_usable_size(ptr);
#endif
#ifdef WINDOWS
sz = _msize(ptr);
#endif
// fprintf(stderr, "freeable bytes = %ld\n", sz);
if (sz)
return(TRUE);
return(FALSE);
}
void safe_free(void *ptr, const char *function, int line)
{
if (freeable(ptr) == FALSE) {
if (ptr == NULL)
fprintf(stderr, "%s(): Attempting to free NULL object [called from function %s(), line %d]\n\n", __FUNCTION__, function, line);
else
fprintf(stderr, "%s(): Attempting to free unallocated, statically allocated, or previously freed object [called from function %s(), line %d]\n\n", __FUNCTION__, function, line);
return;
}
free(ptr);
fprintf(stderr, "%s(): Successfully freed object [called from function %s(), line %d]\n\n", __FUNCTION__, function, line);
return;
}
int main(int argc, char *argv[])
{
void *ptr;
size_t sz;
ptr = NULL;
fprintf(stderr, "\nfree NULL ptr:\n");
safe_free(ptr, __FUNCTION__, __LINE__);
ptr = (void *) "string";
fprintf(stderr, "free static string:\n");
safe_free(ptr, __FUNCTION__, __LINE__);
ptr = (void *) 0x0123456789BCDEF;
fprintf(stderr, "free unallocated ptr:\n");
safe_free(ptr, __FUNCTION__, __LINE__);
ptr = (void *) malloc(10);
fprintf(stderr, "free allocated ptr:\n");
safe_free(ptr, __FUNCTION__, __LINE__);
fprintf(stderr, "free previously freed ptr:\n");
safe_free(ptr, __FUNCTION__, __LINE__);
return(0);
}