急!! 那能找到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失败,最典型的原因是内存越界和指针绝对值改变
[解决办法]
/****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);}