Questions sur la POO dans MQL5 - page 72

 

J'ai un certain malentendu avec les pointeurs dans MQL5 - une "chose non spécifiée".

J'ai rencontré un problème avec un script de test (j'ai joint la bibliothèque) :

ce code va supprimer le pointeur, tout est 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; 
}

Au début, je voulais l'écrire de cette façon :

#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; 
}

lors de l'exécution du script, j'obtiens : 1 objet de type JSONParser left


Alors comment puis-je supprimer ce JSONParser en dehors de la fonction ?


Dossiers :
Include.zip  12 kb
 
Igor Makanu:

J'ai un certain malentendu avec les pointeurs dans MQL5 - une "chose non spécifiée".

J'ai rencontré un problème avec un script de test (la bibliothèque est jointe) :

ce code va supprimer le pointeur, tout est OK.

Au début, je voulais l'écrire de cette façon :

lors de l'exécution du script, j'obtiens : 1 objet de type JSONParser left


Alors comment puis-je supprimer ce JSONParser en dehors de la fonction ?


Dans ce cas, un objet temporaire doit être créé sur la pile))))
CSomeObj(<params>).SomeMethod()
 
Vladimir Simakov:
Vous devez créer un objet temporaire sur la pile dans ce cas)))
CSomeObj(<params>).SomeMethod()

Ceci est mon premier exemple, je crée JSONParser dans la portée locale, il sera supprimé lorsque je quitterai la fonction.

La question est, au fond, que des choses comme un exemple #2 Sharp va avaler, et ici je dois encore réfléchir ... en général Sharp est plus succinct que Pros !!! - donc pour un cholivar ! )))

 
Igor Makanu:

Ceci est mon premier exemple, je crée JSONParser dans la portée locale, il sera supprimé lorsque je quitterai la fonction.

la question est, en principe, que des choses comme un exemple numéro 2 Sharpe va avaler, et ici vous avez encore besoin de penser ... en général Sharp est plus succinct que Pros !!! - donc pour un cholivar ! )))

Vous créez un pointeur vers un objet dans une zone locale, mais l'objet lui-même est dans le tas et c'est ce qui fuit).
Ce n'est pas un Sharp, il manque le collecteur d'ordures))))
 
Vladimir Simakov:
Vous créez un pointeur vers un objet dans une zone locale et l'objet lui-même est dans un tas et c'est l'objet qui fuit).
Ce n'est pas Sharpe, il n'y a pas de ramasseur d'ordures))).

Je t'avais dit que Sharpe était le meilleur ! )))

Nn, en général, la première option que j'utiliserai et ne dérangera pas le cerveau, merci de votre participation !

 

Je ne comprends pas le comportement des pointeurs en MQL de toute façon, ce code fonctionne sans aucun problème et supprimera tous les objets créés dynamiquement à la fin du script :

#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;
}


Pourquoi cela fonctionne-t-il ? J'ai supprimé l'objet JSONParser *parser, il devrait donc récupérer tous les pointeurs associés comme NULL.

 
Igor Makanu:

Je ne comprends pas le comportement des pointeurs en MQL de toute façon, ce code fonctionne sans aucun problème et supprimera tous les objets créés dynamiquement à la fin du script :


Pourquoi cela fonctionne-t-il ? Je viens de supprimer l'objet JSONParser *parser, donc tous les pointeurs devraient être considérés comme NULL.

Pourquoi ?

Encore une fois, ce n'est pas Sharp, il n'y a pas de "références liées"... L'objet vit jusqu'à ce que le programmeur le tue personnellement, quelles que soient les références.

 
Maxim Kuznetsov:

pourquoi je ferais ça ?

encore une fois ce n'est pas Sharpe, il n'y a pas de "références liées"... L'objet vit jusqu'à ce que le programmeur le tue personnellement, indépendamment des références.

Eh bien, c'est la question, nous avons une variante exploitable du code, mais le comportement des pointeurs n'est pas clair pour moi.

En théorie, la variante 2 du premier message devrait fonctionner

 
C'est hilarant pour les utilisateurs qui se lancent dans des discussions sur le "haut" alors qu'en pratique, ils ne sont pas capables d'assembler 1+1.
Je me demande si l'effet Dunning-Krueger pique quelque part ?
 

comme je suis effronté ici...

tu as eu une remise de connaissance, je n'ai pas eu de remise) même si elles sont toutes chères.

Raison: