C++の::operator new,::operator delete

2170 ワード

一般的にnewとdeleteを使用する場合、空間の構成(newは割り当て、deleteは回収)ではなく、オブジェクトの構造関数を呼び出す2つのことをします.
しかし、この2つの過程を分ける方法もあります.
それは明示的な呼び出しです::operator new,::operator delete、それらは空間配置だけを行って、オブジェクトの構造関数を呼び出しません
具体的には、次の例を参照してください.
// operator new[] example

#include <iostream> // std::cout

#include <new> // ::operator new[]



struct MyClass {

  int data;

  MyClass() {std::cout << '*';}  // print an asterisk for each construction

};



int main () {

  std::cout << "constructions (1): ";

  // allocates and constructs five objects:

  MyClass * p1 = new MyClass[5];

  std::cout << '
'
; std::cout << "constructions (2): "; // allocates and constructs five objects (nothrow): MyClass * p2 = new (std::nothrow) MyClass[5]; std::cout << '
'
; std::cout << "constructions (3): "; // allocates storage for five objects, but does not construct them: MyClass * p3 = static_cast<MyClass*> (::operator new (sizeof(MyClass[5]))); std::cout << '
'
; std::cout << "constructions (4): "; // constructs five objects at p3, but does not allocate: new (p3) MyClass[5]; std::cout << '
'
; delete[] p3; delete[] p2; delete[] p1; return 0; }

Edit & Run
 
 
operator deleteとoperator newについては、ここのプロトタイプ定義を参照してください.
http://en.cppreference.com/w/cpp/memory/new/operator_delete
http://en.cppreference.com/w/cpp/memory/new/operator_new
すべてvoid*型のポインタで、C言語のmalloc freeメカニズムとはあまり差がないことがわかります.