【C++】newとdelete
- C言語でメモリを動的割り当てするときはmalloc()を使用し、メモリを開放するときにfree()を使う
- C++ではnewを使用してメモリを割り当て、deleteを使用して開放する
- new演算子は自動的に十分なメモリを割り当てる
- sizeof()などを使用する必要がない
- new演算子は指定した方のポインタを自動的に返す
- malloc()関数を使用してメモリを当てるような明示的に型キャストは行わなくて良い
- オーバーロードできる
study120.cpp
#include <iostream> using namespace std; class samp { int i, j; public: void set_ij( int a, int b ) { i = a; j = b; } int get_product() { return i*j; } }; int main() { samp *p; p = new samp; if (!p) { cout << "メモリ割り当てエラー\n"; return 1; } p->set_ij( 4, 5 ); cout << "積は:" << p->get_product() << "\n"; return 0; }
$ ./study120 積は:20
study122.cpp
#include <iostream> using namespace std; class samp { int i, j; public: samp( int a, int b ) { i = a; j = b; } int get_product() { return i*j; } }; int main() { samp *p; p = new samp( 6, 5 ); if( !p ) { cout << "メモリ割り当てエラー\n"; return 1; } cout << "積は:" << p->get_product() << "\n"; delete p; return 0; }
$ ./study122 積は:30
動的に割り当てられたオブジェクトに初期値を渡している。
study125.cpp
#include <iostream> using namespace std; class samp { int i, j; public: void set_ij( int a, int b ) { i = a; j = b; } samp() { cout << "コンストラクタの呼び出し\n"; } ~samp() { cout << "デストラクタの呼び出し\n"; } int get_product() { return i*j; } }; int main() { samp *p; p = new samp [10]; if ( !p ) { cout << "メモリ割り当てエラー\n"; return 1; } for ( int i = 0; i < 10; ++i ) p[i].set_ij( i, i ); for ( int i = 0; i < 10; ++i ) { cout << "積[" << i << "]は:" << p[i].get_product() << "\n"; } delete [] p; return 0; }
$ ./study125 コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し コンストラクタの呼び出し 積[0]は:0 積[1]は:1 積[2]は:4 積[3]は:9 積[4]は:16 積[5]は:25 積[6]は:36 積[7]は:49 積[8]は:64 積[9]は:81 デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し デストラクタの呼び出し
コンストラクタ、デストラクタがどのタイミングで呼ばれているかの確認