MQL5中的OOP问题 - 页 72

 

我对MQL5中的指针 有一些误解--一个非常 "不明确的东西"。

我在一个测试脚本中遇到了一个问题(我已经附上了库)。

这段代码将删除指针,一切正常。

#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个JSONParser类型的对象离开了


那么我如何在函数之外删除这个JSONParser呢?


附加的文件:
Include.zip  12 kb
 
Igor Makanu:

我对MQL5中的指针 有一些误解--一个非常 "不明确的东西"。

我在一个测试脚本中遇到了一个问题(我已经附上了库)。

这段代码将删除指针,一切正常。

我一开始就想这样写。

当运行脚本时,我得到: 1个JSONParser类型的对象离开了


那么我如何在函数之外删除这个JSONParser呢?


在这种情况下,必须在堆栈中创建一个临时对象)))
CSomeObj(<params>).SomeMethod()
 
Vladimir Simakov:
在这种情况下,你必须在堆栈上创建一个临时对象))) 。
CSomeObj(<params>).SomeMethod()

这是我的第一个例子,我在本地范围内创建了JSONParser,当我退出函数时它将被删除。

问题是,基本上,这样的事情作为一个例子#2夏普会吞下,这里我仍然需要思考......在一般情况下,夏普比普罗斯更简洁!!--所以对于一个Cholivar!)))

 
Igor Makanu:

这是我的第一个例子,我在本地范围内创建JSONParser,当我退出函数时,它将被删除。

问题是,在原则上,这样的事情作为一个例子2夏普将吞下,在这里,你仍然需要思考......在一般情况下,夏普比普罗斯更简洁!!--所以对于一个Cholivar!)))

你在局部区域创建了一个指向对象的指针,但对象本身在堆中,这就是泄露的原因)。
这不是夏普,垃圾收集器不见了)))。
 
Vladimir Simakov:
你在局部区域创建了一个指向对象的指针,而对象本身在堆中,是对象泄漏了)。
这不是夏普,没有收集垃圾的人)))。

我告诉过你夏普的规则!)))

Nn,一般来说,第一个选项我会使用,不会打扰到大脑,谢谢你的参与!

 

反正我不明白MQL中指针的行为,这段代码工作起来没有任何问题,而且会在脚本结束时删除所有动态创建的对象。

#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:

反正我不明白MQL中指针的行为,这段代码工作起来没有任何问题,而且会在脚本结束时删除所有动态创建的对象。


刚刚删除了 JSONParser *parser对象,所以它应该得到所有的指针为NULL。

为什么?

再说一遍,这不是夏普,没有 "链接参考 "这种东西......该对象一直活到程序员亲自杀了它为止,而不考虑引用。

 
Maxim Kuznetsov:

我为什么要这样做?

再说一遍,这不是夏普,没有 "链接参考 "这回事......该对象一直活到程序员亲自杀了它为止,而不考虑引用。

嗯,这就是问题所在,我们有一个可行的代码变体,但指针的行为对我来说并不清楚

从理论上讲,第一条信息中的变体2应该可以工作

 
对于那些讨论 "高 "的用户来说,这很搞笑,因为实际上他们不能把1+1放在一起。
我不知道邓宁-克鲁格效应是否刺痛了任何地方?
 

我在这里是多么厚颜无耻......

你得到了知识折扣,我没有得到折扣),尽管它们都很昂贵。