当前位置: 代码迷 >> WinCE >> Alloc failed的有关问题
  详细解决方案

Alloc failed的有关问题

热度:416   发布时间:2016-04-28 13:52:32.0
Alloc failed的问题
程序运行的时候打印窗口一直显示:AtlasSurfaceHeapManager::Alloc failed, Heap Node

有谁遇到过这种问题啊?是什么原因导致的啊?

------解决方案--------------------
分配内存失败 检查代码

-----------------

C/C++ code
/****malloc.c - Get a block of memory from the heap**    Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.**Purpose:*    Defines the malloc() function.********************************************************************************/#include <cruntime.h>#include <malloc.h>#include <internal.h>#include <mtdll.h>#include <dbgint.h>#ifdef WINHEAP#include <windows.h>#include <winheap.h>#else /* WINHEAP */#include <heap.h>#endif /* WINHEAP */extern int _newmode;  /* malloc new() handler mode *//****void *malloc(size_t size) - Get a block of memory from the heap**Purpose:*    Allocate of block of memory of at least size bytes from the heap and*    return a pointer to it.**    Calls the new appropriate new handler (if installed).**Entry:*    size_t size - size of block requested**Exit:*    Success: Pointer to memory block*    Failure: NULL (or some error value)**Uses:**Exceptions:********************************************************************************/void * __cdecl _malloc_base (size_t size){   return _nh_malloc_base(size, _newmode);}/****void *_nh_malloc_base(size_t size) - Get a block of memory from the heap**Purpose:*    Allocate of block of memory of at least size bytes from the heap and*    return a pointer to it.**    Calls the appropriate new handler (if installed).**    There are two distinct new handler schemes supported. The 'new' ANSI*    C++ scheme overrides the 'old' scheme when it is activated. A value of*    _NOPTH for the 'new' handler indicates that it is inactivated and the*    'old' handler is then called.**Entry:*    size_t size - size of block requested**Exit:*    Success: Pointer to memory block*    Failure: NULL (or some error value)**Uses:**Exceptions:********************************************************************************/void * __cdecl _nh_malloc_base (size_t size, int nhFlag){   void * pvReturn;    // validate size   if (size > _HEAP_MAXREQ)     return NULL;#ifndef WINHEAP   /* round requested size */   size = _ROUND2(size, _GRANULARITY);#endif /* WINHEAP */    for (;;) {      // allocate memory block     if (size <= _HEAP_MAXREQ)       pvReturn = _heap_alloc_base(size);     else       pvReturn = NULL;      // if successful allocation, return pointer to memory     // if new handling turned off altogether, return NULL      if (pvReturn || nhFlag == 0)       return pvReturn;      // call installed new handler     if (!_callnewh(size))       return NULL;      // new handler was successful -- try to allocate again   }}/****void *_heap_alloc_base(size_t size) - does actual allocation**Purpose:*    Same as malloc() except the new handler is not called.**Entry:*    See malloc**Exit:*    See malloc**Exceptions:********************************************************************************/void * __cdecl _heap_alloc_base (size_t size){#ifdef WINHEAP   void * pvReturn;#else /* WINHEAP */   _PBLKDESC pdesc;   _PBLKDESC pdesc2;#endif /* WINHEAP */#ifdef WINHEAP    if (size <= __sbh_threshold)   {     _mlock(_HEAP_LOCK);     pvReturn = __sbh_alloc_block(size);     _munlock(_HEAP_LOCK);     if (pvReturn)       return pvReturn;   }    if (size == 0)     size = 1;   size = (size + BYTES_PER_PARA - 1) & ~(BYTES_PER_PARA - 1);   return HeapAlloc(_crtheap, 0, size);}#else /* WINHEAP */    /* try to find a big enough free block    */   if ( (pdesc = _heap_search(size)) == NULL )   {     if ( _heap_grow(size) != -1 )     {       /* try finding a big enough free block again. the        * success of the call to _heap_grow should guarantee        * it, but...        */       if ( (pdesc = _heap_search(size)) == NULL )       {         /* something unexpected, and very bad, has          * happened. abort!          */         _heap_abort();       }     }     else       return NULL;   }    /* carve the block into two pieces (if necessary). the first piece    * shall be of the exact requested size, marked inuse and returned to    * the caller. the leftover piece is to be marked free.    */   if ( _BLKSIZE(pdesc) != size ) {     /* split up the block and free the leftover piece back to      * the heap      */     if ( (pdesc2 = _heap_split_block(pdesc, size)) != NULL )       _SET_FREE(pdesc2);   }    /* mark pdesc inuse    */   _SET_INUSE(pdesc);    /* check proverdesc and reset, if necessary    */    _heap_desc.proverdesc = pdesc->pnextdesc;    return( (void *)((char *)_ADDRESS(pdesc) + _HDRSIZE) );}/****_PBLKDESC _heap_split_block(pdesc, newsize) - split a heap allocation block*    into two allocation blocks**Purpose:*    Split the allocation block described by pdesc into two blocks, the*    first one being of newsize bytes.**    Notes: It is caller's responsibilty to set the status (i.e., free*    or inuse) of the two new blocks, and to check and reset proverdesc*    if necessary. See Exceptions (below) for additional requirements.**Entry:*    _PBLKDESC pdesc - pointer to the allocation block descriptor*    size_t newsize - size for the first of the two sub-blocks (i.e.,*         (i.e., newsize == _BLKSIZE(pdesc), on exit)**Exit:*    If successful, return a pointer to the descriptor for the leftover*    block.*    Otherwise, return NULL.**Exceptions:*    It is assumed pdesc points to a valid allocation block descriptor and*    newsize is a valid heap block size as is (i.e., WITHOUT rounding). If*    either of these of assumption is violated, _heap_split_block() will*    likely corrupt the heap. Note also that _heap_split_block will simply*    return to the caller if newsize >= _BLKSIZE(pdesc), on entry.********************************************************************************/_PBLKDESC __cdecl _heap_split_block (   REG1 _PBLKDESC pdesc,   size_t newsize   ){   REG2 _PBLKDESC pdesc2;    _ASSERTE((_heap_split_block: bad pdesc arg, _CHECK_PDESC(pdesc)));   _ASSERTE((_heap_split_block: bad newsize arg, _ROUND2(newsize,_GRANULARITY) == newsize));    /* carve the block into two pieces (if possible). the first piece    * is to be exactly newsize bytes.    */   if ( (_BLKSIZE(pdesc) > newsize) && ((pdesc2 = __getempty())       != NULL) )   {     /* set it up to manage the second piece and link it in to      * the list      */     pdesc2->pblock = (void *)((char *)_ADDRESS(pdesc) + newsize +          _HDRSIZE);     *(void **)(pdesc2->pblock) = pdesc2;     pdesc2->pnextdesc = pdesc->pnextdesc;     pdesc->pnextdesc = pdesc2;      return pdesc2;   }   return NULL;}#endif /* WINHEAP */
  相关解决方案