@@ -58,36 +58,35 @@ iter->ptr = ptr; return ptr; } } - fprintf(stderr, "WARNING: Memory at %p was not allocated as part of " - "object %s!\n-> Memory was not resized!\n", ptr, [self name]); - + @throw [OFMemNotPartOfObjException new: ptr fromObject: self]; return NULL; } - (void)freeMem: (void*)ptr; { struct __ofobject_allocated_mem *iter; for (iter = __mem_pool; iter != NULL; iter = iter->prev) { if (iter->ptr == ptr) { - if (iter->prev != NULL) + if (iter->prev != NULL) iter->prev->next = iter->next; if (iter->next != NULL) iter->next->prev = iter->prev; + if (__mem_pool == iter) + __mem_pool = NULL; free(iter); free(ptr); return; } } - fprintf(stderr, "WARNING: Memory at %p was not allocated as part of " - "object %s!\n-> Memory was not free'd!\n", ptr, [self name]); + @throw [OFMemNotPartOfObjException new: ptr fromObject: self]; } - free { struct __ofobject_allocated_mem *iter, *iter2; @@ -99,5 +98,24 @@ } return [super free]; } @end + +@implementation OFMemNotPartOfObjException ++ new: (void*)ptr fromObject: (id)obj +{ + return [[OFMemNotPartOfObjException alloc] init: ptr + fromObject: obj]; +} + +- init: (void*)ptr fromObject: (id)obj +{ + fprintf(stderr, "ERROR: Memory at %p was not allocated as part of " + "object %s!\n" + "ERROR: -> Not changing memory allocation!\n" + "ERROR: (Hint: It is possible that you tried to free the same " + "memory twice!)\n", ptr, [obj name]); + + return [super init]; +} +@end