当前位置:编程学习 > C/C++ >>

第18章 特殊工具与技术(4)

18.1.6 类特定的new和delete

编译器看到类类型的new或delete表达式的时候,它查看该类是否有operator new或operator delete成员,如果类定义(或继承)了自己的成员new和delete函数,则使用那些函数为对象分配和释放内存;否则,调用这些函数的标准库版本。

1. 成员new和delete函数

如果类定义了这两个成员中的一个,它也应该定义另一个。

类成员operator new函数必须具有返回类型void*并接受size_t类型的形参。由new表达式用以字节计算的分配内存量初始化函数的size_t形参。

类成员operator delete函数必须具有返回类型void。它可以定义为接受单个void*类型形参,也可以定义为接受两个形参,即void*和size_t类型。由delete表达式用被delete的指针初始化void*形参,该指针可以是空指针。如果提供了size_t形参,就用编译器用第一个形参所指对象的字节大小自动初始化size_t形参。

这些函数隐式为静态函数,不必显式地将它们声明为static,虽然这样做是合法的。成员new和delete函数必须是静态的,因为它们要么在构造对象之前使用(operator new),要么在撤销对象之后使用(operator delete),因此,这些函数没有成员可操纵。像任意其他静态成员函数一样,new和delete只能直接访问所属类的静态成员。

2. 数组操作符new[]和操作符delete[]

也可以定义成员operator new[]和operator delete[]来管理类类型的数组。如果这些operator 函数存在,编译器就使用它们代替全局版本。

3. 覆盖类特定的内存分配

如果类定义了自己的成员new和delete,类的用户就可以通过使用全局作用域确定操作符,强制new或delete表达式使用全局的库函数。


Vector<int> *vec=::new Vector<int>;  
::delete vec; 
 Vector<int> *vec=::new Vector<int>;
 ::delete vec;即使类定义了自己的类特定的operator new,也调用全局的operator new;delete类似。

如果用new表达式调用全局operator new函数分配内存,则delete表达式也应该调用全局operator delete函数。


template<class T> 
class Vector{ 
public: 
    Vector():elements(0),first_free(0),end(0){} 
    void push_back(const T&); 
    void *operator new[](size_t); //allocate an array  
    void operator delete[](void*); //delete memory of an array  
private: 
    static std::allocator<T> alloc; 
    void reallocate(); 
    T* elements; //first element  
    T* first_free; //behind the last actual element  
    T* end; //behind vector conent  
}; 
 
template<class T> 
void Vector<T>::push_back(const T& t){ 
if(first_free==end) 
    reallocate(); //gets more space and copies existing elements to it  
    new(first_free) T(t); 
++first_free; 

 
template <class T> 
void Vector<T>::reallocate(){ 
std::ptrdiff_t size=first_free-elements; 
std::ptrdiff_t newcapacity=2*max(size,1); 
T* newelements=static_cast<T*>(alloc.operator new[](newcapacity)); 
 
uninitialized_copy(elements,first_free,newelements); 
 
for(T *p=first_free;p!=elements;){ 
alloc.destroy(--p); 

 
if(elements) 
    alloc.operator delete[](elements,end-elements); 
 
elements=newelements; 
first_free=elements+size; 
end=elements=newcapacity; 


摘自 xufei96的专栏
 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,