MFC的CString(VC6) 内存管理分析[2]

nbsp; try{ // 分配内存64m_nallocsize.
     pnewblock = cplex::create(m_pblocks, m_nblocksize, m_nallocsize);
       }catch_all(e){
            ...
异常

       }end_catch_all
       //
下面的代是将内存块压m_pnodefree表中待用。
       cnode* pnode = (cnode*)pnewblock->data();
       (byte*&)pnode += (m_nallocsize * m_nblocksize) - m_nallocsize;
       for (int i = m_nblocksize-1; i >= 0; i--, (byte*&)pnode -= m_nallocsize)
       {
    pnode->pnext = m_pnodefree;
    m_pnodefree = pnode;
       }
    }
    //
两句是出一内存给调用者使用。
    void* pnode = m_pnodefree;
    m_pnodefree = m_pnodefree->pnext;
    ...
    return pnode;
}
/*
 
用者free,只是将这块内存重新m_pnodefree表中
 
并非放,而是可用以待后用。
*/
void cfixedalloc::free(void* p)
{
    if (p != null)
    {
        entercriticalsection(&m_protect);
        cnode* pnode = (cnode*)p;
        pnode->pnext = m_pnodefree;
        m_pnodefree = pnode;
        leavecriticalsection(&m_protect);
    }
}
void cfixedalloc::freeall()
{
    entercriticalsection(&m_protect);
    m_pblocks->freedatachain();
    m_pblocks = null;
    m_pnodefree = null;
    leavecriticalsection(&m_protect);
}
/*
  
在析构函数中 freeall放内存
*/
cfixedalloc::~cfixedalloc()
{
    freeall();
   deletecriticalsection(&m_protect);
}



 
  

 
  

 
  







 
  

 
  

 
  

 

 

你可能感兴趣的:(KK_Base基础类库学习,mfc,pascal,byte,null,structure,delete)