delete演算子とは?
delete演算子は、new演算子で作成されたオブジェクトを解除し、オブジェクトによって占有されていたメモリを解放します。削除操作が実行された後、オブジェクト記述子は無効になります。
MQL5のオブジェクトポインタは、実際にはオブジェクト記述子と呼ばれます。これは、オブジェクトのメモリ上の場所を直接指すポインタではなく、オブジェクトを一意に識別するためのハンドルのようなものです。
これにより、メモリリーク(使い終わったメモリが解放されずに無駄に消費され続けること)を防ぎ、プログラムのパフォーマンスが向上します。
delete演算子の基本構文
delete演算子の基本構文は次の通りです。
delete pointer;
ここで、pointerは解放するメモリを指すオブジェクト記述子(オブジェクトを一意に識別するためのハンドルのようなもの)です。delete演算子を使うことで、この記述子が指しているメモリが解放されます。削除操作が実行された後、オブジェクト記述子は無効になります。
使用例
次に、delete演算子を使用した例を示します。
// オブジェクトを動的に作成
SampleClass *sampleObject = new SampleClass(10, "example");
// 使用後にオブジェクトを削除
delete sampleObject;
sampleObject = NULL;
この例では、SampleClassのオブジェクトが動的に作成され、使用後にdelete演算子でメモリが解放されています。解放後、ポインタをNULLに設定しているのは、安全のためです。
delete演算子を使う際の注意点
オブジェクトポインタはメモリアドレスではなく、オブジェクト記述子(オブジェクトを操作するための情報)である点に注意が必要です。オブジェクトを削除する際には、ポインタがNULLでないことを確認することが推奨されます。ポインタのチェックにはCheckPointer関数を使用できます。
delete演算子を使ったサンプルコード
以下に、delete演算子を使用して動的に確保されたメモリを解放するサンプルコードを示します。
// サンプルクラスの定義
class SampleClass
{
public:
int number;
string text;
// コンストラクタ
SampleClass(int num, string txt)
{
number = num;
text = txt;
}
};
// OnStart関数
void OnStart()
{
// オブジェクトを動的に作成
SampleClass *sampleObject = new SampleClass(10, "example");
// オブジェクトの使用
Print("Number: ", sampleObject.number);
Print("Text: ", sampleObject.text);
// 使用後にオブジェクトを削除
delete sampleObject;
sampleObject = NULL;
}
この例では、SampleClassのオブジェクトが動的に作成され、使用後にdelete演算子でメモリが解放されています。解放後、ポインタをNULLに設定することで安全性が高まります。
以上が、delete演算子についての詳細な解説です。delete演算子を正しく使用することで、プログラムのメモリ管理が適切に行われ、メモリリークやクラッシュを防ぐことができます。
<参照>