C++の::operator new,::operator delete
2170 ワード
一般的にnewとdeleteを使用する場合、空間の構成(newは割り当て、deleteは回収)ではなく、オブジェクトの構造関数を呼び出す2つのことをします.
しかし、この2つの過程を分ける方法もあります.
それは明示的な呼び出しです::operator new,::operator delete、それらは空間配置だけを行って、オブジェクトの構造関数を呼び出しません
具体的には、次の例を参照してください.
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メカニズムとはあまり差がないことがわかります.
しかし、この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メカニズムとはあまり差がないことがわかります.