オブジェクトの作成と解除
MQL5 プログラムが実行のために読み込まれた後、メモリは、その型に応じて各変数に割り当てられます。すべての変数は、アクセスレベルに応じてグローバル変数とローカル変数の 2 種類に分かれています。メモリクラスによると、それらは MQL5 プログラムの入力パラメータ、静的と自動に分けられます。変数は必要に応じて対応する値に初期化されます。使用後には初期化解除され、変数によって使用されたメモリは MQL5 実行システムに戻されます。
グローバル変数の初期化と初期化解除
グローバル変数は、MQL5 プログラムが読み入れられた直後、関数が 1 つでも呼び出される前に自動的に初期化されます。初期化中に、基本データ型の変数には初期値が割り当てられ、オブジェクトにはコンストラクタ(もしあれば)が呼び出されます。入力変数はは常にグローバルレベルで宣言され、プログラム開始時にダイアログでユーザが設定した値で初期化されます。
静的変数は通常ローカルレベルで宣言されていますが、グローバル変数と同様に、メモリが前もって割り当てられ、初期化はプログラム読み込みの直後に行われます。
初期化の順序は、プログラムの変数宣言順に対応しています。初期化解除は逆の順序で実行されます。この規則は、new 演算子によって作成されていない変数に対してのみ適応します。このような変数は、プログラム読み込み後に自動的に作成/初期化され、プログラムのアンロードの前に初期化解除されます。
ローカル変数の初期化と初期化解除
ローカルレベルで宣言した変数が静的でない場合は、メモリが自動的に割り当てられます。グローバル変数と同様に、ローカル変数は、プログラムの実行が宣言を満たした瞬間に自動的に初期化されます。従って、初期化の順序は、宣言の順序に対応しています。
ローカル変数は、宣言されたプログラムブロックの最後に宣言の逆の順序で初期化解除されます。プログラムブロックは複合演算子で switch 選択演算子、反復演算子( for、while、do-while )、関数本体及び if-else 演算子の一部になることがあります。
ローカル変数は、プログラムの実行が変数宣言を満たす時に初めて初期化されます。変数が宣言されているブロックが実行されなかった場合は、そのような変数は初期化されていません。
配置されたオブジェクトの初期化と初期化解除
ポインタの宣言は、対応するオブジェクトの初期化を伴わないのでオブジェクトポインタは特殊となります。動的に配置されたオブジェクトは、new 演算子がクラスのサンプル作成した時点で初期化されます。オブジェクトの初期化は、対応するクラスのコンストラクタの呼び出しを前提としています。クラス内に対応するコンストラクタがない場合、基本データ型のメンバは自動的には初期化されません。文字列、動的配列及び複合型オブジェクト型のメンバは自動的に初期化されます。
ポインタは、ローカルまたはグローバルレベルで宣言することができ、NULLの空の値、または 同じ型か継承された 型を持つポインタの値で初期化出来ます。new 演算子がローカルレベルで宣言されたポインタに対して呼び出さた場合、このポインタの delete 演算はレベルを終了する前に実行される必要があります。さもないと、ポインタが失われ、オブジェクトの明示的な削除は失敗します。
object_pointer=new Class_name の式を使用して作成されたオブジェクトは delete(object_pointer) 演算子で削除されなければいけません。このような変数が delete 演算子 によってプログラム終了時に削除されない場合は、対応するエントリが「エキスパート」操作ログに表示されます。複数の変数を宣言し、それらの全てに 1 つのオブジェクトポインタを割り当てることは可能です。
動的に作成されたオブジェクトにコンストラクタがある場合、このコンストラクタは、new 演算子の実行の瞬間に呼び出されます。オブジェクトにデストラクタがある場合、それは delete 演算子の実行中に呼び出されます。
このように、動的に配置されたオブジェクトは new 演算子で初めて作成され、delete 演算子またはプログラムアンロード時に MQL5 の実行システムによって自動的に削除されます。 動的に作成されたオブジェクトのポインタの宣言の順序は、初期化の順序には影響しません。初期化と初期化解除の順序はプログラマによって完全に制御されます。
MQL5 における動的なメモリ割り当て
動的配列を使用すると、解放されたメモリは、すぐにオペレーティングシステムに戻されます。
new 演算子を使用して動的なクラスのオブジェクトを作成する時、メモリは初め、メモリマネージャが使用しているクラスメモリプールから要求されます。充分なメモリがプール内にない場合、メモリは、オペレーティングシステムから要求されます。delete 演算子を使用して動的なクラスのオブジェクトを削除する時、解放されたメモリはすぐにクラスメモリプールに戻されます。
メモリマネージャは OnInit()、OnDeinit()、OnStart()、OnTick()、OnCalculate()、OnTimer()、OnTrade()、OnTester()、OnTesterInit()、OnTesterPass()、OnTesterDeinit()、OnChartEvent()、OnBookEvent() イベント処理関数の終了後、解放したメモリを直ちにオペレーティングシステムに返します。
変数の特徴
作成と削除の順序、またコンストラクタとデストラクタの呼び出しに関する主な情報は以下の表に示されています。
グローバル自動変数 |
ローカル自動変数 |
動的に作成されたオブジェクト |
|
---|---|---|---|
初期化 |
MQL5 プログラム読み込みの直後 |
宣言されたコード行の実行時 |
new 演算子の実行時 |
初期化順 |
宣言の順序 |
宣言の順序 |
宣言の順序と関係なし |
初期化解除 |
MQL5 プログラムのアンロード前 |
宣言ブロックの実行終了時 |
delete 演算子の実行時またはMQL5 プログラムのアンロード前 |
初期化解除順 |
初期化順の反対 |
初期化順の反対 |
初期化順と無関係 |
コンストラクタの呼び出し |
MQL5 プログラム読み込み時 |
初期化時 |
new 演算子の実行時 |
デストラクタの呼び出し |
MQL5 プログラムのアンロード時 |
変数が初期化されたブロックの終了時 |
delete 演算子の実行時 |
エラーログ |
自動的に作成されたオブジェクトを削除しようとする試みについて「エキスパート」操作ログにメッセージを記録 |
自動的に作成されたオブジェクトを削除しようとする試みについて「エキスパート」操作ログにメッセージを記録 |
MQL5 プログラムのアンロード時に削除を取り消すに動的に作成されたオブジェクトについて「エキスパート」操作ログにメッセージを記録 |
参照