⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atexit.c

📁 减少内存碎片的malloc分配函数
💻 C
字号:
/* * * Copyright (c) 1994, Textil Computer Design GmbH, Dresden * * Author: J"org Wunsch * * Dumb atexit() implementation. It is far from being elegant. It is * only here to provide a workaround for systems where the existing * atexit() implementation is known to cause problems due to doing * own mallocs. The problem arose originally on a Data General * machine running DG/UX 5.4R*, along with gcc compiling C++ code. * In order to have global and static variables called their const- * ructors, a chunk of code has been placed by the compiler that * ran before invoking main(). This code registered the desctructors * with atexit() at this very early stage, but the existing atexit() * bypassed the normal memory allocation scheme, and hence caused * grievous troubles in combination with the dmalloc library. * * Known problem for DG/UX: the crt0.o (at least in a COFF environ- * ment) passes the return value from main() to _real_exit() instead * of exit(). Hence programs which return from main instead of calling * exit() do not work as expected. I do not see any good workaround * for this so far (since crt0.o always happens to reference the * _real_exit() from the library, even if we would provide our very * own symbol for it). * * Permission to use, copy, modify, and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies, and that * the name of TCD GmbH not be used in advertising or publicity pertaining to * distribution of the document or software without specific, written prior * permission. * * Textil Computer Design GmbH makes no representations about the * suitability of the software described herein for any purpose.  It * is provided "as is" without express or implied warranty. *//* ANSI C requires at least 32 atexit functions to be allowed */#define MAXATEXIT 32static void (*__atexit[MAXATEXIT])(void);static int __atexit_registered = 0;intatexit(void (*fn)(void)) {  if(__atexit_registered == MAXATEXIT) return -1;    __atexit[__atexit_registered++] = fn;  return 0;}voidexit(int status) {  static int already_in_atexit = 0;  extern void _exit(int);  if(already_in_atexit++)    /* some silly atexit()-registered stuff called exit(); give up */    _exit(status);    while(__atexit_registered)    (*__atexit[--__atexit_registered])();  _exit(status);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -