C++ Primer 学习笔记_100_特殊工具与技术 --优化内存分配[续2](二)

2015-07-20 17:54:00 · 作者: · 浏览: 12
tOajrCDU2s72ubm6r8r91tDS0b6tx+Wz/cHLttTP87G+ye2jrGRlbGV0ZSCx7bTvyr3U2rX308Mgb3BlcmF0b3IgZGVsZXRlINaux7C199PDzva5ubqvyv2ho29wZXJhdG9yIGRlbGV0ZSCzydSxuty88rWlo7o8L3A+PHByZSBjbGFzcz0="brush:java;">template void CachedObj ::operator delete(void *p,std::size_t) { if (p != 0) add_to_freelist(static_cast (p)); }

它调用 add_to_freelist 成员将被删除对象放回自由列表。

令人感兴趣的部分是强制类型转换。在删除动态分配的类类型对象时调用 operator delete,编译器将该对象的地址传给 operator delete。但是,指针的形参类型必须是 void*,在调用 add_to_freelist 之前,必须将指针从 void* 强制转换为它的实际类型,本例中,那个类型是指向 T 的指针,它是 CachedObj 派生类型的对象的指针。

6.add_to_freelist成员

这个成员的任务是设置next指针,并且在将对象加到自由列表时更新freeStore指针:

template 
  
   
void CachedObj
   
    ::add_to_freelist(T *p) { p -> CachedObj
    
     ::next = freeStore; freeStore = p; }
    
   
  

为了避免任何与派生类中定义的成员可能的冲突,显式指定我们正在给基类成员 next 赋值。

7.定义静态数据成员

template 
  
    std::allocator
   
     CachedObj
    
     ::alloc_mem; template 
     
       T *CachedObj
      
       ::freeStore = 0; template 
       
         const std::size_t CachedObj
        
         ::chunk = 24; 
        
       
      
     
    
   
  

照常,对于类模板的静态成员,每个类型使用不同的静态成员来实例化 CachedObj 类。将 chunk 初始化为任意值,本例中为 24。将 freeStore 指针初始化为 0,指出自由列表开始时为空。alloc_mem 成员不需要初始化,但必须记得定义它。


//P646 习题18.10 源代码修改之后
class iStack
{
public:
    iStack(int capacity):stack(capacity),top(0) {}
    iStack():top(0) {}

private:
    vector
  
    stack;
    int top;
};

int main()
{
    iStack *ps = new iStack(20);
    const iStack *ps2 = new const iStack(15);
    iStack *ps3 = new iStack[100];
}