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

스크립트를 실행할 때 다음을 얻습니다. JSONParser 유형의 객체 1개 남음


이 JSONParser를 함수 외부에서 어떻게 제거하시겠습니까?


파일:
Include.zip  12 kb
 
Igor Makanu :

어딘가에 내가 MQL5의 포인터로 오해하는 것 - 매우 "비표시적인 것"

문제가 발생하여 스크립트를 테스트했습니다(라이브러리를 첨부했습니다).

이 코드는 포인터를 삭제합니다. 모든 것이 정상입니다.

나는 다음과 같이 쓰고 싶었다.

스크립트를 실행할 때 다음을 얻습니다. JSONParser 유형의 객체 1개 남음


이 JSONParser를 함수 외부에서 어떻게 제거하시겠습니까?


이 경우 스택에서 임시 객체를 생성해야 합니다)))
CSomeObj(<params>).SomeMethod()
 
Vladimir Simakov :
이 경우 스택에서 임시 객체를 생성해야 합니다)))
CSomeObj(<params>).SomeMethod()

이것은 내 첫 번째 예입니다. 거기에서 로컬 가시성에서 JSONParser를 생성합니다. 함수를 종료하면 삭제됩니다.

문제는 원칙적으로 예 2와 같은 것들이 Sharpe에 의해 삼켜질 것이고 여기서 여전히 생각할 필요가 있다는 것입니다 ... 일반적으로 Sharpe는 Pluses보다 간결합니다 !! - 그래서 holivar를 위해! )))

 
Igor Makanu :

이것은 내 첫 번째 예입니다. 거기에서 로컬 가시성에서 JSONParser를 생성합니다. 함수를 종료하면 삭제됩니다.

문제는 원칙적으로 예 2와 같은 것들이 Sharp에 의해 삼켜질 것이라는 것입니다. 여기서 여전히 생각해야 합니다... 일반적으로 Sharp는 Pluses보다 간결합니다!! - 그래서 holivar를 위해! )))

로컬 영역에 있는 개체에 대한 포인터를 만들고 개체 자체가 힙에 있고 누출되는 사람이 바로 그 사람입니다.
샤프가없고 가비지 컬렉터가 없습니다)))
 
Vladimir Simakov :
로컬 영역에 있는 개체에 대한 포인터를 만들고 개체 자체가 힙에 있고 누출되는 사람이 바로 그 사람입니다.
샤프가없고 가비지 컬렉터가 없습니다)))

나는 날카로운 규칙을 말하는거야! )))

월, 일반적으로 나는 첫 번째 옵션을 사용하고 두뇌를 급상승하지 않을 것입니다. 참여해주셔서 감사합니다!

 

어쨌든 저는 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을 더할 수 없습니다.
더닝 크루거 효과가 아무데도 누르지 않는다는 것이 그들에게 흥미 롭습니까?
 

내가 여기 얼마나 오만, ..

당신은 지식에 대한 할인을 가지고, 나는 할인을받지 않았다) 모두 비싸지 만