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

📄 malloc.c

📁 一个很好的内存泄露的监测代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* Malloc implementation for multiple threads without lock contention.   Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc.   This file is part of the GNU C Library.   Contributed by Wolfram Gloger <wg@malloc.de>   and Doug Lea <dl@cs.oswego.edu>, 2001.   The GNU C Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public License as   published by the Free Software Foundation; either version 2.1 of the   License, or (at your option) any later version.   The GNU C Library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; see the file COPYING.LIB.  If not,   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA.  *//*  This is a version (aka ptmalloc2) of malloc/free/realloc written by  Doug Lea and adapted to multiple threads/arenas by Wolfram Gloger.* Version ptmalloc2-20011215  $Id: malloc.c,v 1.20 2004/11/04 17:31:04 wg Exp $  based on:  VERSION 2.7.1pre1 Sat May 12 07:41:21 2001  Doug Lea  (dl at gee)   Note: There may be an updated version of this malloc obtainable at           http://www.malloc.de/malloc/ptmalloc2.tar.gz         Check before installing!* Quickstart  In order to compile this implementation, a Makefile is provided with  the ptmalloc2 distribution, which has pre-defined targets for some  popular systems (e.g. "make posix" for Posix threads).  All that is  typically required with regard to compiler flags is the selection of  an appropriate malloc-machine.h include file via -I directives.  Many/most systems will additionally require USE_TSD_DATA_HACK to be  defined, so this is the default for "make posix".* Why use this malloc?  This is not the fastest, most space-conserving, most portable, or  most tunable malloc ever written. However it is among the fastest  while also being among the most space-conserving, portable and tunable.  Consistent balance across these factors results in a good general-purpose  allocator for malloc-intensive programs.  The main properties of the algorithms are:  * For large (>= 512 bytes) requests, it is a pure best-fit allocator,    with ties normally decided via FIFO (i.e. least recently used).  * For small (<= 64 bytes by default) requests, it is a caching    allocator, that maintains pools of quickly recycled chunks.  * In between, and for combinations of large and small requests, it does    the best it can trying to meet both goals at once.  * For very large requests (>= 128KB by default), it relies on system    memory mapping facilities, if supported.  For a longer but slightly out of date high-level description, see     http://gee.cs.oswego.edu/dl/html/malloc.html  You may already by default be using a C library containing a malloc  that is  based on some version of this malloc (for example in  linux). You might still want to use the one in this file in order to  customize settings or to avoid overheads associated with library  versions.* Contents, described in more detail in "description of public routines" below.  Standard (ANSI/SVID/...)  functions:    malloc(size_t n);    calloc(size_t n_elements, size_t element_size);    free(Void_t* p);    realloc(Void_t* p, size_t n);    memalign(size_t alignment, size_t n);    valloc(size_t n);    mallinfo()    mallopt(int parameter_number, int parameter_value)  Additional functions:    independent_calloc(size_t n_elements, size_t size, Void_t* chunks[]);    independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);    pvalloc(size_t n);    cfree(Void_t* p);    malloc_trim(size_t pad);    malloc_usable_size(Void_t* p);    malloc_stats();* Vital statistics:  Supported pointer representation:       4 or 8 bytes  Supported size_t  representation:       4 or 8 bytes       Note that size_t is allowed to be 4 bytes even if pointers are 8.       You can adjust this by defining INTERNAL_SIZE_T  Alignment:                              2 * sizeof(size_t) (default)       (i.e., 8 byte alignment with 4byte size_t). This suffices for       nearly all current machines and C compilers. However, you can       define MALLOC_ALIGNMENT to be wider than this if necessary.  Minimum overhead per allocated chunk:   4 or 8 bytes       Each malloced chunk has a hidden word of overhead holding size       and status information.  Minimum allocated size: 4-byte ptrs:  16 bytes    (including 4 overhead)                          8-byte ptrs:  24/32 bytes (including, 4/8 overhead)       When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte       ptrs but 4 byte size) or 24 (for 8/8) additional bytes are       needed; 4 (8) for a trailing size field and 8 (16) bytes for       free list pointers. Thus, the minimum allocatable size is       16/24/32 bytes.       Even a request for zero bytes (i.e., malloc(0)) returns a       pointer to something of the minimum allocatable size.       The maximum overhead wastage (i.e., number of extra bytes       allocated than were requested in malloc) is less than or equal       to the minimum size, except for requests >= mmap_threshold that       are serviced via mmap(), where the worst case wastage is 2 *       sizeof(size_t) bytes plus the remainder from a system page (the       minimal mmap unit); typically 4096 or 8192 bytes.  Maximum allocated size:  4-byte size_t: 2^32 minus about two pages                           8-byte size_t: 2^64 minus about two pages       It is assumed that (possibly signed) size_t values suffice to       represent chunk sizes. `Possibly signed' is due to the fact       that `size_t' may be defined on a system as either a signed or       an unsigned type. The ISO C standard says that it must be       unsigned, but a few systems are known not to adhere to this.       Additionally, even when size_t is unsigned, sbrk (which is by       default used to obtain memory from system) accepts signed       arguments, and may not be able to handle size_t-wide arguments       with negative sign bit.  Generally, values that would       appear as negative after accounting for overhead and alignment       are supported only via mmap(), which does not have this       limitation.       Requests for sizes outside the allowed range will perform an optional       failure action and then return null. (Requests may also       also fail because a system is out of memory.)  Thread-safety: thread-safe unless NO_THREADS is defined  Compliance: I believe it is compliant with the 1997 Single Unix Specification       (See http://www.opennc.org). Also SVID/XPG, ANSI C, and probably       others as well.* Synopsis of compile-time options:    People have reported using previous versions of this malloc on all    versions of Unix, sometimes by tweaking some of the defines    below. It has been tested most extensively on Solaris and    Linux. It is also reported to work on WIN32 platforms.    People also report using it in stand-alone embedded systems.    The implementation is in straight, hand-tuned ANSI C.  It is not    at all modular. (Sorry!)  It uses a lot of macros.  To be at all    usable, this code should be compiled using an optimizing compiler    (for example gcc -O3) that can simplify expressions and control    paths. (FAQ: some macros import variables as arguments rather than    declare locals because people reported that some debuggers    otherwise get confused.)    OPTION                     DEFAULT VALUE    Compilation Environment options:    __STD_C                    derived from C compiler defines    WIN32                      NOT defined    HAVE_MEMCPY                defined    USE_MEMCPY                 1 if HAVE_MEMCPY is defined    HAVE_MMAP                  defined as 1    MMAP_CLEARS                1    HAVE_MREMAP                0 unless linux defined    USE_ARENAS                 the same as HAVE_MMAP    USE_STARTER                1    malloc_getpagesize         derived from system #includes, or 4096 if not    HAVE_USR_INCLUDE_MALLOC_H  NOT defined    LACKS_UNISTD_H             NOT defined unless WIN32    LACKS_SYS_PARAM_H          NOT defined unless WIN32    LACKS_SYS_MMAN_H           NOT defined unless WIN32    Changing default word sizes:    INTERNAL_SIZE_T            size_t    MALLOC_ALIGNMENT           2 * sizeof(INTERNAL_SIZE_T)    Configuration and functionality options:    USE_DL_PREFIX              NOT defined    USE_PUBLIC_MALLOC_WRAPPERS NOT defined    USE_MALLOC_LOCK            NOT defined    MALLOC_DEBUG               NOT defined    REALLOC_ZERO_BYTES_FREES   1    MALLOC_FAILURE_ACTION      errno = ENOMEM, if __STD_C defined, else no-op    TRIM_FASTBINS              0    FIRST_SORTED_BIN_SIZE      512    Options for customizing MORECORE:    MORECORE                   sbrk    MORECORE_FAILURE           -1    MORECORE_CONTIGUOUS        1    MORECORE_CANNOT_TRIM       NOT defined    MORECORE_CLEARS            1    MMAP_AS_MORECORE_SIZE      (1024 * 1024)    Tuning options that are also dynamically changeable via mallopt:    DEFAULT_MXFAST             64    DEFAULT_TRIM_THRESHOLD     128 * 1024    DEFAULT_TOP_PAD            0    DEFAULT_MMAP_THRESHOLD     128 * 1024    DEFAULT_MMAP_MAX           65536    There are several other #defined constants and macros that you    probably don't want to touch unless you are extending or adapting malloc.  *//*  __STD_C should be nonzero if using ANSI-standard C compiler, a C++  compiler, or a C compiler sufficiently close to ANSI to get away  with it.*/#ifndef __STD_C#if defined(__STDC__) || defined(__cplusplus)#define __STD_C     1#else#define __STD_C     0#endif#endif /*__STD_C*//*  Void_t* is the pointer type that malloc should say it returns*/#ifndef Void_t#if (__STD_C || defined(WIN32))#define Void_t      void#else#define Void_t      char#endif#endif /*Void_t*/#if __STD_C#include <stddef.h>   /* for size_t */#include <stdlib.h>   /* for getenv(), abort() */#else#include <sys/types.h>#endif#include <malloc-machine.h>#ifdef __cplusplusextern "C" {#endif/* define LACKS_UNISTD_H if your system does not have a <unistd.h>. *//* #define  LACKS_UNISTD_H */#ifndef LACKS_UNISTD_H#include <unistd.h>#endif/* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. *//* #define  LACKS_SYS_PARAM_H */#include <stdio.h>    /* needed for malloc_stats */#include <errno.h>    /* needed for optional MALLOC_FAILURE_ACTION *//*  Debugging:  Because freed chunks may be overwritten with bookkeeping fields, this  malloc will often die when freed memory is overwritten by user  programs.  This can be very effective (albeit in an annoying way)  in helping track down dangling pointers.  If you compile with -DMALLOC_DEBUG, a number of assertion checks are  enabled that will catch more memory errors. You probably won't be  able to make much sense of the actual assertion errors, but they  should help you locate incorrectly overwritten memory.  The checking  is fairly extensive, and will slow down execution  noticeably. Calling malloc_stats or mallinfo with MALLOC_DEBUG set  will attempt to check every non-mmapped allocated and free chunk in  the course of computing the summmaries. (By nature, mmapped regions  cannot be checked very much automatically.)  Setting MALLOC_DEBUG may also be helpful if you are trying to modify  this code. The assertions in the check routines spell out in more  detail the assumptions and invariants underlying the algorithms.  Setting MALLOC_DEBUG does NOT provide an automated mechanism for  checking that all accesses to malloced memory stay within their  bounds. However, there are several add-ons and adaptations of this  or other mallocs available that do this.*/#if MALLOC_DEBUG#include <assert.h>#else#undef assert#define assert(x) ((void)0)#endif/*  INTERNAL_SIZE_T is the word-size used for internal bookkeeping  of chunk sizes.  The default version is the same as size_t.  While not strictly necessary, it is best to define this as an  unsigned type, even if size_t is a signed type. This may avoid some  artificial size limitations on some systems.  On a 64-bit machine, you may be able to reduce malloc overhead by  defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the  expense of not being able to handle more than 2^32 of malloced  space. If this limitation is acceptable, you are encouraged to set  this unless you are on a platform requiring 16byte alignments. In  this case the alignment requirements turn out to negate any  potential advantages of decreasing size_t word size.  Implementors: Beware of the possible combinations of:     - INTERNAL_SIZE_T might be signed or unsigned, might be 32 or 64 bits,       and might be the same width as int or as long     - size_t might have different width and signedness as INTERNAL_SIZE_T     - int and long might be 32 or 64 bits, and might be the same width  To deal with this, most comparisons and difference computations  among INTERNAL_SIZE_Ts should cast them to unsigned long, being  aware of the fact that casting an unsigned int to a wider long does  not sign-extend. (This also makes checking for negative numbers  awkward.) Some of these casts result in harmless compiler warnings  on some systems.*/#ifndef INTERNAL_SIZE_T#define INTERNAL_SIZE_T size_t#endif/* The corresponding word size */#define SIZE_SZ                (sizeof(INTERNAL_SIZE_T))/*  MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.  It must be a power of two at least 2 * SIZE_SZ, even on machines  for which smaller alignments would suffice. It may be defined as  larger than this though. Note however that code and data structures  are optimized for the case of 8-byte alignment.*/

⌨️ 快捷键说明

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