第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++ ,