本文隻讨論關于自定義類型的new/delete。
模拟實作new:
template<class T>
T* New(size_t n)
{
//先開辟一段空間,要多開4位元組,用來存放開了多少個對象
T* ptr = (T*)operator new(sizeof(T)*n+);
*((int*)ptr) = n;
//ptr向後移4位元組,開始給每一段對象的空間調用構造函數
ptr = (T*)((char*)ptr + );
for (size_t i = ; 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 - );
for (size_t i = ; i < n; i++){
(ptr+i)->~T();//給開辟的n個對象調用析構函數
}
//最後釋放存n的空間
operator delete((int*)ptr - );
}
測試
這是一個簡單的自定義類型,建立對象時會給new一個12位元組的空間,對象結束時會delete掉。
class Seqlist{
public:
Seqlist(){
cout << "構造函數" << endl;
_a = new int[];
}
~Seqlist(){
cout << "析構函數" << endl;
if (_a){
delete[] _a;
_a = NULL;
}
}
private:
int* _a;
};
Seqlist* p = New<Seqlist>(3);
Delete<Seqlist>(p);