专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > WinCE

Alloc failed的有关问题

发布时间:2010-06-13 22:26:44 文章来源:www.iduyao.cn 采编人员:星星草
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 */
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: