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];
}