首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

急 那能找出VC6.0的 dbgheap.c 源码

2012-07-04 
急!! 那能找到VC6.0的 dbgheap.c 源码!_CrtIsVolidHeapPointer(pUserData)dbgheap.c line 1011new 的类,

急!! 那能找到VC6.0的 dbgheap.c 源码!
_CrtIsVolidHeapPointer(pUserData)
dbgheap.c line 1011

new 的类, 调用delete释放时出错, 调用折构函数时出错的, 跟踪到 scalar deleting destructor()

怎么也查不出为什么内存出错。 于是想看 dbgheap.c 源码。




[解决办法]
装VC6的时候装了源码的话就能跟踪到了,去找一个完整的VC6吧,VS6.0企业版应该是3CD的

不过楼主方向错了,99%不是VC6的bug,即便是你又能怎样?

delete失败,最典型的原因是内存越界和指针绝对值改变
[解决办法]

C/C++ code
/****dbgheap.c - Debug CRT Heap Functions**       Copyright (c) 1988-1997, Microsoft Corporation. All rights reserved.**Purpose:*       Defines debug versions of heap functions.********************************************************************************/#ifdef _DEBUG#ifdef _WIN32#include <windows.h>#include <winheap.h>#else  /* _WIN32 */#include <memory.h>#include <string.h>#define FALSE 0#define TRUE  1#define BYTE char#endif  /* _WIN32 */#include <ctype.h>#include <dbgint.h>#ifndef WINHEAP#include <heap.h>#endif  /* WINHEAP */#include <internal.h>#include <limits.h>#include <malloc.h>#include <mtdll.h>#include <stdio.h>#include <stdlib.h>/*--------------------------------------- * * Heap management * --------------------------------------*/#ifdef _MACextern Handle hHeapRegions;#endif  /* _MAC */#define IGNORE_REQ  0L              /* Request number for ignore block */#define IGNORE_LINE 0xFEDCBABC      /* Line number for ignore block *//* * Bitfield flag that controls CRT heap behavior -- * default is to record all allocations (_CRTDBG_ALLOC_MEM_DF) */int _crtDbgFlag = _CRTDBG_ALLOC_MEM_DF;static long _lRequestCurr = 1;      /* Current request number */_CRTIMP long _crtBreakAlloc = -1L;          /* Break on allocation by request number */static unsigned long _lTotalAlloc;  /* Grand total - sum of all allocations */static unsigned long _lCurAlloc;    /* Total amount currently allocated */static unsigned long _lMaxAlloc;    /* Largest ever allocated at once *//* * The following values are non-zero, constant, odd, large, and atypical *      Non-zero values help find bugs assuming zero filled data. *      Constant values are good so that memory filling is deterministic *          (to help make bugs reproducable).  Of course it is bad if *          the constant filling of weird values masks a bug. *      Mathematically odd numbers are good for finding bugs assuming a cleared *          lower bit, as well as useful for trapping on the Mac. *      Large numbers (byte values at least) are less typical, and are good *          at finding bad addresses. *      Atypical values (i.e. not too often) are good since they typically *          cause early detection in code. *      For the case of no-man's land and free blocks, if you store to any *          of these locations, the memory integrity checker will detect it. */static unsigned char _bNoMansLandFill = 0xFD;   /* fill no-man's land with this */static unsigned char _bDeadLandFill   = 0xDD;   /* fill free objects with this */static unsigned char _bCleanLandFill  = 0xCD;   /* fill new objects with this */static _CrtMemBlockHeader * _pFirstBlock;static _CrtMemBlockHeader * _pLastBlock;_CRT_DUMP_CLIENT _pfnDumpClient;#if _FREE_BLOCK != 0 || _NORMAL_BLOCK != 1 || _CRT_BLOCK != 2 || _IGNORE_BLOCK != 3 || _CLIENT_BLOCK != 4#error Block numbers have changed !#endif  /* _FREE_BLOCK != 0 || _NORMAL_BLOCK != 1 || _CRT_BLOCK != 2 || _IGNORE_BLOCK != 3 || _CLIENT_BLOCK != 4 */static char * szBlockUseName[_MAX_BLOCKS] = {        "Free",        "Normal",        "CRT",        "Ignore",        "Client",        };int __cdecl CheckBytes(unsigned char *, unsigned char, size_t);/****void *malloc() - Get a block of memory from the debug heap**Purpose:*       Allocate of block of memory of at least size bytes from the heap and*       return a pointer to it.**       Allocates 'normal' memory block.**Entry:*       size_t          nSize       - size of block requested**Exit:*       Success:  Pointer to memory block*       Failure:  NULL (or some error value)**Exceptions:********************************************************************************/_CRTIMP void * __cdecl malloc (        size_t nSize        ){        return _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);}/****void * _malloc_dbg() - Get a block of memory from the debug heap**Purpose:*       Allocate of block of memory of at least size bytes from the heap and*       return a pointer to it.**       Allocates any type of supported memory block.**Entry:*       size_t          nSize       - size of block requested*       int             nBlockUse   - block type*       char *          szFileName  - file name*       int             nLine       - line number**Exit:*       Success:  Pointer to memory block*       Failure:  NULL (or some error value)**Exceptions:********************************************************************************/_CRTIMP void * __cdecl _malloc_dbg (        size_t nSize,        int nBlockUse,        const char * szFileName,        int nLine        ){        return _nh_malloc_dbg(nSize, _newmode, nBlockUse, szFileName, nLine);}/****void * _nh_malloc() - Get a block of memory from the debug heap**Purpose:*       Allocate of block of memory of at least size bytes from the debug*       heap and return a pointer to it. Assumes heap already locked.**       If no blocks available, call new handler.**       Allocates 'normal' memory block.**Entry:*       size_t          nSize       - size of block requested*       int             nhFlag      - TRUE if new handler function**Exit:*       Success:  Pointer to (user portion of) memory block*       Failure:  NULL**Exceptions:********************************************************************************/void * __cdecl _nh_malloc (        size_t nSize,        int nhFlag        ){        return _nh_malloc_dbg(nSize, nhFlag, _NORMAL_BLOCK, NULL, 0);}/****void * _nh_malloc_dbg() - Get a block of memory from the debug heap**Purpose:*       Allocate of block of memory of at least size bytes from the debug*       heap and return a pointer to it. Assumes heap already locked.**       If no blocks available, call new handler.**       Allocates any type of supported memory block.**Entry:*       size_t          nSize       - size of block requested*       int             nhFlag      - TRUE if new handler function*       int             nBlockUse   - block type*       char *          szFileName  - file name*       int             nLine       - line number**Exit:*       Success:  Pointer to (user portion of) memory block*       Failure:  NULL**Exceptions:********************************************************************************/void * __cdecl _nh_malloc_dbg (        size_t nSize,        int nhFlag,        int nBlockUse,        const char * szFileName,        int nLine        ){        void * pvBlk;        for (;;)        {            /* lock the heap             */            _mlock(_HEAP_LOCK);            /* do the allocation             */            pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);            /* unlock the heap             */            _munlock(_HEAP_LOCK);            if (pvBlk || nhFlag == 0)                return pvBlk;            /* call installed new handler */            if (!_callnewh(nSize))                return NULL;            /* new handler was successful -- try to allocate again */        }}/****void * _heap_alloc() - does actual allocation**Purpose:*       Does heap allocation.**       Allocates 'normal' memory block.**Entry:*       size_t          nSize       - size of block requested**Exit:*       Success:  Pointer to (user portion of) memory block*       Failure:  NULL**Exceptions:********************************************************************************/void * __cdecl _heap_alloc(        size_t nSize        ){        return _heap_alloc_dbg(nSize, _NORMAL_BLOCK, NULL, 0);} 

热点排行