static void malloc_fini_impl() { if (libc_malloc_impl_handle) { MallocDebugFini malloc_debug_finalize = reinterpret_cast<MallocDebugFini>(dlsym(libc_malloc_impl_handle, "malloc_debug_finalize")); if (malloc_debug_finalize) { malloc_debug_finalize(); } } }
static void malloc_fini_impl(void) { if (libc_malloc_impl_handle) { MallocDebugFini malloc_debug_finalize = NULL; malloc_debug_finalize = dlsym(libc_malloc_impl_handle, "malloc_debug_finalize"); if (malloc_debug_finalize) malloc_debug_finalize(); } }
static void malloc_fini_impl() { // Our BSD stdio implementation doesn't close the standard streams, it only flushes them. // And it doesn't do that until its atexit handler is run, and we run first! // It's great that other unclosed FILE*s show up as malloc leaks, but we need to manually // clean up the standard streams ourselves. fclose(stdin); fclose(stdout); fclose(stderr); if (libc_malloc_impl_handle != NULL) { MallocDebugFini malloc_debug_finalize = reinterpret_cast<MallocDebugFini>(dlsym(libc_malloc_impl_handle, "malloc_debug_finalize")); if (malloc_debug_finalize != NULL) { malloc_debug_finalize(g_malloc_debug_level); } } }