オブジェクト作成と削除
MQL4プログラムが実行の為にロードされた後、メモリはその種類に応じて各変数に割り当てられます。
全ての変数はアクセスレベルに応じて、
グローバル変数と
ローカル変数の2つのタイプに分けられます。
According to the memory class they can be input parameters of a mql4 program, static and automatic.
必要に応じて、各変数は対応する値で初期化されます。
使用された後の変数は解放され、メモリはMQL4実行システムに戻されます。
グローバル変数の初期化と解放
グローバル変数はMQL4プログラムがロードされた直後、関数が呼び出される前に自動的に初期化されます。
初期値で初期化中は
シンプルな型の変数に割り当てられ、コンストラクタはオブジェクトに対して呼び出されます。
インプット変数は常にグローバルレベルで宣言され、プログラム開始時にダイアログでユーザーが設定した値で初期化されます。
通常、
静的変数はローカルレベルで宣言しても、変数のメモリが事前に割り当てられ、初期化はグローバル変数と同様にプログラムがロードされた直後に行われます。
初期化順序はプログラム変数の宣言順に行われます。
解放は逆の順番に行われます。
この規則は、
new演算子によって作成されていない変数に対しても同様です。
このような変数はプログラムロード後に自動的に作成・初期化され、プログラムのアンロード前に開放されます。
ローカル変数の初期化と解放
ローカルレベルで宣言した変数が静的なもので無い場合は、メモリはローカル変数に自動的に割り当てます。
プログラムの実行がローカル変数宣言に到達した時に自動的に初期化されます。
従って初期化の順序は、宣言の順序に対応しています。
ローカル変数は宣言されたプログラムブロックの最後で解放されます。
重文処理(
switch文の処理や、
for文/
while文/
do-while文による繰り返し処理、
if-else文の処理や、
関数本体等)が該当します。
ローカル変数は、プログラムの実行が変数宣言に到達した瞬間に初期化されます。
プログラムの実行が、変数が宣言されているブロックに到達しなかった場合、その変数は初期化されません。
オブジェクト配置の初期化と解放
特別なケースで
オブジェクトポインタを持ちます。
ポインタの宣言は対応するオブジェクトの初期化を伴いません。
動的に配置されたオブジェクトは、
new演算子によってクラスが作成された時にのみ初期化されます。
オブジェクトの初期化は対応するクラスのコンストラクタ呼び出しを前提としています。
クラス内に対応するコンストラクタが無い場合は、シンプルな型のメンバーは自動的に初期化されません。
文字列と
動的配列と
複雑な型メンバは自動的に初期化されます。
ポインタはローカル又はグローバルレベルで宣言する事が出来ます。
ポインタは
NULLで初期化する事が出来ます、また同じポインタ値や
継承で初期化する事が出来ます。
new演算子はローカルレベルでポインタで呼び出された場合、このポインタ用のdelete演算子はそのレベルが終了する前に実行する必要があります。
それ以外の場合はポインタは失われ、オブジェクトの明示的な削除は失敗します。
new演算子によって作成された全てのオブジェクトは、
delete演算子(new演算子によって返されたオブジェクトポインタ)で削除しなければなりません。
何らかの理由でそのような変数が、プログラム完了時にdelete演算子によって削除されなかった場合、
対応するエントリが"エキスパート"ジャーナルウィンドウに表示されます。
動的に作成されたオブジェクトがコンストラクタを持つ場合、このコンストラクタはnew演算子による実行時に呼び出されます。
オブジェクトにデストラクタがある場合は、delete演算子による実行時に呼び出されます。
このようにnew演算子によって作成された時にのみ、動的に配置されたオブジェクトが作成されます。
また、delete演算子やプログラムのアンロード時にMQL4の実行システムによって削除されます。
動的に作成されたオブジェクトのポインタ宣言の順序は、初期化の順序に影響しません。
初期化と解放の順序は完全にプログラマによって制御されます。
MQL4の動的メモリ割り当て
動的配列で操作する時、解放されたメモリは直ぐにオペレーティングシステムに返されます。
new演算子を使用して動的クラスオブジェクトを操作する時、最初のメモリはクラスメモリプール(メモリマネージャーの管理)から要求されます。
十分なメモリがプールに無い場合、メモリはオペレーティングシステムから要求します。
delete演算子を使用して動的オブジェクトを削除すると、解放解放されたメモリは直ぐにクラスメモリプールに戻されます。
メモリマネージャーは
イベントハンドラ関数の後にオペレーティングシステムに開放メモリを戻します。
変数の特徴一覧
/ |
グローバル自動変数 |
ローカル自動変数 |
動的作成オブジェクト |
初期化 |
MQL4プログラムがロードされた時 |
宣言されたコード行に処理実行が到達した時 |
実行時 |
初期化順 |
宣言順 |
宣言順 |
宣言順に関係しない |
解放 |
MQL4プログラムがアンロードされる前 |
処理実行が宣言ブロック終了に到達した時 |
delete演算子が実行された時、 またはMQL4プログラムがアンロードされる前 |
解放順 |
初期化順の反対 |
初期化順の反対 |
初期化順に関係しない |
コンストラクタ 呼び出し |
MQL4プログラムロード時 |
初期化時 |
new演算子の実行時 |
デストラクタ 呼び出し |
MQL4プログラムのアンロード時 |
変数が初期化されたブロックを終了する時 |
delete演算子の実行時 |
エラーログ (エキスパートジャーナル) |
自動的に作成されたオブジェクトを削除しようとするとログ出力 |
自動的に作成されたオブジェクトを削除しようとするとログ出力 |
MQL4プログラムのアンロード時に、 削除されていない動的オブジェクトについてログ出力 |