MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 598

 
Juer:

CArrayObjオブジェクトを作成し、そこに他のオブジェクトを追加しているのかどうか教えてください。やはり、モノそのものが必要です。そして、このリストオブジェクトを削除することができます。

削除する前に、どの方法でオブジェクトを削除すればいいのでしょうか?Detach()Delete() か?

またはClear()/Shutdown()?

混乱するのは、メモリがどのように割り当てられ、どのように処理されるべきかを理解していないためです。一般に、CArrayObjやその中に位置するオブジェクトは存在しない。 手動で削除する必要はありません.

// Где-то в коде есть объект CArrayObj
CArrayObj ArrayOfItems;
...
//Где-то в коде заполнили коллекцию пользовательскими объектами
void Create()
{
  ArrayOfItems.Add(new CUserItem());
  ArrayOfItems.Add(new CUserItem());
  //...
  ArrayOfItems.Add(new CUserItem());
}
// Так не правильно делать. Удалять ничего не надо.
void OnDeinit(const int reason)
{
   delete ArrayOfItems;
}
 

クラス関数にオブジェクトを渡し、その参照を渡すことで、関数内のアクションがそのオブジェクトに起こり、それが返されるようにしています。でも、もうクラスオブジェクト そのものは必要ないんですよね...。では、どのように削除すればいいのでしょうか?

for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=test_objects.At(i);
   if(!CheckPointer(test_object)
        continue;
   CTestClass *test_class=new CTestClass();
   if(test_class.Check(test_object))
        res=true;
   delete test_class;
  }

こんな感じ。test_classを削除すると、Invalid pointer at the next iterationと表示される...。

test_classに渡されたオブジェクトを削除せずに、test_classを削除するには?

 
Vasiliy Sokolov:

メモリがどのように割り当てられ、どのように処理されるべきかを理解していないため、混乱しているのです。一般的なケースでは、CArrayObjとその中のオブジェクトのいずれも , 手動で削除する必要はありません.

さて、もし私がオブジェクトの配列を作ったとしたら。つまり、配列オブジェクトArrayObjを作成し、それに対して必要なアクションを実行したのです。では、このオブジェクトは必要なく、その中のオブジェクトそのもの(配列のメンバー)が必要なのですが、この配列オブジェクトは削除してはいけないのでしょうか?

 

このvv Ihor Heraskoは週末にそれを作る、そしてそれはそこにない ; )

の質問は、先週の木曜日から保留になっています。: )

このままでは来週いっぱい待たされるし、フクロウをフリーランサーに渡して修正してもらわなければならない ; )
 
Juer:

クラス関数にオブジェクトを渡し、その参照を渡すことで、関数内のアクションがそのオブジェクトに起こり、それが返されるようにしています。でも、もうクラスオブジェクト そのものは必要ないんですよね...。では、どのように削除すればいいのでしょうか?

こんな感じ。test_classを削除すると、Invalid pointer at the next iterationと表示される...。

test_classに渡されたオブジェクトを削除せずに、test_classを削除するには?

オブジェクトへのポインターを作らないようにする必要があります。その代わり、関数のスタック上にあるオブジェクトを直接操作します。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   bool res=false;
   CTestObject *test_object=dynamic_cast<CTestObject*>(test_objects.At(i));
   if(test_object == NULL)
        continue;
   if(test_class.Check(test_object))
        res=true;
  }

test_objectはCTestObjectを含むことが保証されているので(これらのオブジェクト以外に何も追加していませんよね:)、ゴーストチェックを削除することでコードを簡素化することができます。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
  {
   CTestObject *test_object = test_objects.At(i);
   bool res = test_class.Check(test_object);   
  }

そして、ほんの少しだけ。

CTestClass test_class;
for(int i=0;i<test_objects.Total();i++)
   bool res = test_class.Check((CTestObject)test_objects.At(i));
 
Juer:

さて、もし私がオブジェクトの配列を作ったとしたら。つまり、配列オブジェクトArrayObjを作成し、それに対して必要なアクションを実行したのです。では、このオブジェクトは必要なく、中のオブジェクトそのもの(配列のメンバー)が必要なのですが、この配列オブジェクトは削除してはいけないのでしょうか?

CArrayObjの目的を理解していない。そこに置くモノの所有者です。CArrayObjを削除すると、その中に入れていたオブジェクトも削除されます。ArrayObjはこれらのオブジェクトのオーナーであるため、オブジェクトへの参照を制御し、コレクションが不要になったら割り当てられたすべてのメモリを自動的に削除するというマネージャーでもあるのだ。だから、何もフリーにして、delete演算 子を使う必要はないのです。全てはCArrayObj自身が行っています。CArrayObj自体はコンピュータ内でほとんどメモリを消費しない(数十バイト)ので、削除しようとしても無意味です。

 
Vasiliy Sokolov:

CArrayObjの目的を理解していない。そこに置くモノの所有者です。CArrayObjを削除すると、その中に入れたオブジェクトも削除されます。ArrayObjはこれらのオブジェクトのオーナーであるため、オブジェクトへの参照を制御し、コレクションが不要になったら割り当てられたすべてのメモリを自動的に削除するというマネージャーでもあるのだ。だから、何もフリーにして、delete演算 子を使う必要はないのです。全てはCArrayObj自身が行っています。CArrayObj自体はコンピュータ内でほとんどメモリを消費しない(数十バイト)ので、削除しようとしても無駄です。

しかし、その後、削除されていないオブジェクトのエラー CArrayObj

 
Juer:

しかし、その後、削除されていないオブジェクトのエラー CArrayObj

だから、CArrayObjでミスをしたのだ。CArrayObj test_objects の代わりにCArrayObj* test_objects を書きましたが、そのコンストラクタを作るのを忘れていました おそらく CArrayObj を扱うメモリモデルの設定が間違っていたのでしょう。プログラマーは、単にポインターを使いすぎただけなのかもしれません。診断は明快で、必要のないところでポインターを 使うと、しばしばリークを起こす。

 

こんにちは。

テキスト文書の例えば7行目にカーソルを移動して、この位置から部分文字 列を抽出する方法を教えてください...。

1行で複数のテキストファイルと、1行で複数のファイルではどちらが速いですか?

 
Vasiliy Sokolov:

だから、CArrayObjでミスをしたのだ。CArrayObj test_objects の代わりに:CArrayObj* test_objects を書きましたが、そのデストラクタを作るのを忘れていました 単にポインターを付けすぎただけかもしれません。診断は明快で、必要のないところでポインターを 使うと、しばしばリークを起こす。

しかし、どこに全く必要ないのでしょうか?オブジェクトを宣言するだけなら、使う意味はないでしょう?