天天看點

模拟實作C++的new/delete

本文隻讨論關于自定義類型的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;
}
           
模拟實作C++的new/delete

模拟實作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 - );
}
           
模拟實作C++的new/delete

測試

這是一個簡單的自定義類型,建立對象時會給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);
           
模拟實作C++的new/delete

繼續閱讀