memtracker.cpp

来自「About: hamsterdb is a database engine w」· C++ 代码 · 共 118 行

CPP
118
字号
/** * Copyright (C) 2005-2007 Christoph Rupp (chris@crupp.de). * All rights reserved. See file LICENSE for licence and copyright * information. * * memory allocator which tracks memory leaks * */#include <stdexcept>#include "memtracker.h"#define MAGIC_START 0x12345678#define MAGIC_STOP  0x98765432#define OFFSETOF(type, member) ((size_t) &((type *)0)->member)static memdesc_t *get_descriptor(void *p){    return ((memdesc_t *)((char *)p-OFFSETOF(memdesc_t, data)));}static void verify_mem_desc(memdesc_t *desc){    if (desc->size==0)        throw std::out_of_range("memory blob size is 0");    if (desc->magic_start!=MAGIC_START)        throw std::out_of_range("memory blob descriptor is corrupt");    if (*(unsigned *)(desc->data+desc->size)!=MAGIC_STOP)        throw std::out_of_range("memory blob was corrupted after end");}void *alloc_impl(mem_allocator_t *self, const char *file, int line, ham_u32_t size){    memtracker_t *mt=(memtracker_t *)self;    memtracker_priv_t *priv=(memtracker_priv_t *)mt->priv;    memdesc_t *desc=(memdesc_t *)malloc(sizeof(*desc)+size-1+sizeof(int));    if (!desc)        return (0);    memset(desc, 0, sizeof(*desc));    desc->file=file;    desc->line=line;    desc->size=size;    desc->magic_start=MAGIC_START;    *(int *)(desc->data+size)=MAGIC_STOP;    desc->next=priv->header;    if (priv->header)        priv->header->previous=desc;    priv->header=desc;    priv->total+=size;    return (desc->data);}void free_impl(mem_allocator_t *self, const char *file, int line, void *ptr){    memtracker_t *mt=(memtracker_t *)self;    memtracker_priv_t *priv=(memtracker_priv_t *)mt->priv;    memdesc_t *desc, *p, *n;    if (!ptr)        throw std::logic_error("tried to free a null-pointer");    desc=get_descriptor(ptr);    verify_mem_desc(desc);    if (priv->header==desc)        priv->header=desc->next;    else {        p=desc->previous;        n=desc->next;        if (p)            p->next=n;        if (n)            n->previous=p;    }    priv->total-=desc->size;    free(desc);}void close_impl(mem_allocator_t *self){    memtracker_t *mt=(memtracker_t *)self;    (void)mt;    /* TODO ausgabe machen? */}memtracker_t *memtracker_new(void){    static memtracker_t m;    static memtracker_priv_t p;    memset(&m, 0, sizeof(m));    memset(&p, 0, sizeof(p));    m.alloc=alloc_impl;    m.free =free_impl;    m.close=close_impl;    m.priv=&p;    return (&m);}unsigned longmemtracker_get_leaks(memtracker_t *mt){    memtracker_priv_t *priv=(memtracker_priv_t *)mt->priv;    return (priv->total);}

⌨️ 快捷键说明

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