MQL5におけるOOPに関する質問 - ページ 72

 

MQL5のポインタについては、非常に「不特定多数が使うもの」であるため、誤解があります。

テストスクリプトで問題が発生しました(ライブラリを添付しています)。

このコードでポインタが削除されれば、すべてOKです。

#include <JSON\json.mqh>

JSONObject * getJSONObject(const string json)
{
   JSONParser  parser;
   JSONValue*  jv;
   JSONObject* jo = jv = ((JSONParser)(parser)).parse(json);
   if (jv != NULL && jv.isObject()) return(jo);
   Print(__FUNCSIG__ + "parser error, json = ",json);
   delete jv; 
   return(NULL);
}
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj!=NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj; 
}

最初はこう書きたかったんです。

#include <JSON\json.mqh>

JSONObject * getJSONObject(const string json)
{
   JSONValue *jv =((JSONParser *)(new JSONParser())).parse(json);
   if (jv != NULL && jv.isObject()) return((JSONObject *)jv);
   Print(__FUNCSIG__ + "parser error, json = ",json);
   delete jv; 
   return(NULL);
}
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj!=NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj; 
}

スクリプトを実行すると、 1 object of type JSONParser left と表示されます。


このJSONParserを関数の外側で削除するにはどうすればよいのでしょうか?


ファイル:
Include.zip  12 kb
 
Igor Makanu:

MQL5のポインタについては、非常に「不特定多数が使うもの」であるため、誤解があります。

テストスクリプトで問題が発生しました(ライブラリを添付しています)。

このコードでポインタが削除されれば、すべてOKです。

最初はこう書きたかったんです。

スクリプトを実行すると、 1 object of type JSONParser left と表示されます。


このJSONParserを関数の外側で削除するにはどうすればよいのでしょうか?


この場合、スタック上に一時的なオブジェクトを作成する必要があります)))
CSomeObj(<params>).SomeMethod()を実行します。
 
Vladimir Simakov:
この場合、スタック上に一時的なオブジェクトを作成する必要があります))
CSomeObj(<params>).SomeMethod()を実行します。

これは私の最初の例で、ローカルスコープにJSONParserを作成し、私が関数を終了するときに削除されます。

問題は、基本的に例の2番のようなものがシャープに飲み込まれるかどうかで、ここはまだ考える必要があるのですが......。一般的にシャープはプロスより簡潔です!!-だからチョリバーに!?)))

 
Igor Makanu:

これは私の最初の例で、ローカルスコープにJSONParserを作成し、私が関数を終了するときに削除されます。

問題は、原則的には、例番号2シャープが飲み込むようなもので、ここではまだ考える必要があることです...一般的にシャープはプロスより簡潔です!!-だからチョリバーに!?)))

ローカルエリアにオブジェクトへのポインタを作成しますが、オブジェクト自体はヒープにあり、それがリークするのです)。
シャープじゃなくて、ゴミ収集車が行方不明)))
 
Vladimir Simakov:
ローカルエリアにオブジェクトへのポインタを作成し、オブジェクト自体はヒープにあり、リークするのはオブジェクトの方です)。
シャープじゃないんだから、ゴミ回収業者なんていないよ)))

シャープのルールって言ったでしょ!?)))

Nn、一般的に、私が使用し、脳を悩ますことはありません最初のオプション、参加ありがとうございました!。

 

このコードは何の問題もなく動作し、スクリプトの終了時に動的に作成されたオブジェクトをすべて削除します。

#include <JSON\json.mqh>
//+------------------------------------------------------------------+
JSONObject *getJSONObject(const string json)
{
   JSONParser *parser = new JSONParser();
   JSONValue *jv = parser.parse(json);
   delete parser;
   if (jv != NULL && jv.isObject()) return((JSONObject *)jv);
   Print(__FUNCSIG__ + "parser error, json = ", json);
   delete jv;
   return(NULL);
}
//+------------------------------------------------------------------+
void OnStart()
{
   JSONObject *jobj = getJSONObject("{\"ObjType\":2,\"m_period\":1}");
   if(jobj != NULL) Print("m_period = ", jobj.getInt("m_period"));
   delete jobj;
}


JSONParser *parserオブジェクトを削除 したので、関連するすべてのポインタをNULLとして取得する必要があります。

 
Igor Makanu:

このコードは何の問題もなく動作し、スクリプトの終了時に動的に作成されたオブジェクトをすべて削除します。


JSONParser *parserオブジェクトを削除 したので、関連するすべてのポインタをNULLとして取得する必要があります。

なぜ

繰り返しになりますが、これはシャープではありません。"リンク先の参考文献 "なんてものはありません......。オブジェクトは、プログラマが個人的に殺すまで、参照に関係なく生きています。

 
Maxim Kuznetsov:

なぜそんなことを?

またシャープじゃないんだから、「リンク先の参考文献」なんてものはないだろう...。オブジェクトは、プログラマが個人的に殺すまで、参照に関係なく生きています。

まあ、それが問題なのですが、実行可能なコードのバリエーションはありますが、ポインタの動作が私には不明です

理論的には、最初のメッセージにあったバリアント 2 が動作するはずです。

 
実際には1+1も組めないのに「高い」という議論になるユーザーも滑稽です。
ダニング・クルーガー効果はどこかに刺さってるんでしょうかね?
 

なんて生意気なんでしょう。

高いものばかりなのに、知識割引がある、私は割引がない。