本文只讨论关于自定义类型的new/delete。
模拟实现new:
template<class T>
T* New(size_t n)
{
//先开辟一段空间,要多开4字节,用来存放开了多少个对象
T* ptr = (T*)operator new(sizeof(T)*n+4);
*((int*)ptr) = n;
//ptr向后移4字节,开始给每一段对象的空间调用构造函数
ptr = (T*)((char*)ptr + 4);
for (size_t i = 0; i < n; i++){
new(ptr + i)T;//在已经分配的空间上调用构造函数
}
//返回的是往后移4字节的位置
return ptr;
}
模拟实现delete
template<class T>
void Delete(T* ptr)
{
//在ptr的前面的四个字节拿到n
size_t n = *((int*)ptr - 1);
for (size_t i = 0; i < n; i++){
(ptr+i)->~T();//给开辟的n个对象调用析构函数
}
//最后释放存n的空间
operator delete((int*)ptr - 1);
}
测试
这是一个简单的自定义类型,创建对象时会给new一个12字节的空间,对象结束时会delete掉。
class Seqlist{
public:
Seqlist(){
cout << "构造函数" << endl;
_a = new int[3];
}
~Seqlist(){
cout << "析构函数" << endl;
if (_a){
delete[] _a;
_a = NULL;
}
}
private:
int* _a;
};
Seqlist* p = New<Seqlist>(3);
Delete<Seqlist>(p);