2013-05-19 12 views
6

私は、新しい演算子のオーバーロードについてはわかりません。 私はクラスMyClassを持っているとしますが、MyClass.h MyClass.cppとmain.cppファイルは同じです。size_tパラメータnew演算子

//MyClass.h 

class MyClass { 
    public: 
    //Some member functions 
    void* operator new (size_t size); 
    void operator delete (void* ptr); 
    //... 
}; 

//MyClass.cpp 

void* MyClass::operator new(size_t size) { 
    return malloc(size); 
} 

void MyClass::operator delete(void* ptr) { 
    free(ptr); 
} 

//main.cpp 

//Include files 
//... 

int main() { 
    MyClass* cPtr = new MyClass(); 
    delete cPtr 
} 

である。このプログラムは正常に動作しています。しかし、私が理解できないことは、新しい演算子がパラメータなしでどのように呼び出されるのか、その定義には "size_t size"のような関数パラメータがあります。私がここで欠けている点はありますか?おかげさまで

+0

コンパイラが自動的 –

+0

のサイズを通過[このSOの答えを見て](http://stackoverflow.com/questions/9595758/how-is-the-c-new-operator-implemented) – pasty

答えて

6

"new expression"と "operator new"割り当て関数を混同しないでください。前者は後者を引き起こす。 T * p = new T;と言うとき、これは最初にメモリを獲得するために割り当て関数を呼び出すと、はそのメモリ内のオブジェクトを構築します。プロセスは緩く等価である次

void * addr = T::operator new(sizeof(T)); // rough equivalent of what 
T * p = ::new (addr) T;      // "T * p = new T;" means. 

(プラスコンストラクタがスローする場合に例外ハンドラと、メモリその場合、割り当て解除されます。)

0

コンパイラは、クラスのサイズを知っています。基本的にはnew関数にsizeof(MyClass)を渡しています。

1

新しい表現new MyClass()は、基本的に2つのステップで定義されます。まず、割り当てられたメモリを取得するために、オーバーロードしたallocator関数を呼び出します。 MyClass型のサイズをそのアロケータ関数に渡すため、引数が必要です(size_t)。その後、割り当てられたメモリ内にオブジェクトを構築し、ポインタを返します。

関連する問題