Вопросы по ООП в MQL5 - страница 73

 
Igor Makanu:

опускаясь до соответствующего уровня коммуникаций: мой вопрос по теме топика? ты чего сюда влез со своими картинками из инета? ответ знаешь? - нет сиди и молчи ;)

Во первых - не тыкайте, а во вторых - не чего так бурно на правду реагировать.
Честно-говоря, такое впечатление, что вы не очень далеки от вашего сегодняшнего собеседника:

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Igor Makanu, 2020.06.07 13:46

Carcass77Привет всем. Помогите вставить переменную типа String в код. Спасибо

а Вы сами на свой вопрос сумели бы ответить?
или где то выпилили кусок кода и не можете использовать? и нужно угадать что хоть происходит )))
......
но думаю это не выход с таким подходом

 

один небезызвестный добрый модератор обещал отправлять в бан за провокации к матерному ответу :-)

ждёмс... 

 
Кто-то знает больше, кто-то меньше. Форум - для общения и вопросов-ответов.
Не стыдно задать вопрос для обогащения знаний. Стыдно вести себя свысока к вопрошающим - это уровень студента, перешедшего на следующий курс, и вещающий "сакральные знания через губу". Зазнайство в общем...
 
Maxim Kuznetsov:

один небезызвестный добрый модератор обещал отправлять в бан за провокации к матерному ответу :-)

ждёмс... 

меня трудно разозлить, да и все матерные слова в армии успел выговорить, там без них никак )))

 
Maxim Kuznetsov:

один небезызвестный добрый модератор обещал отправлять в бан за провокации к матерному ответу :-)

ждёмс... 

Нет, Максим, не так. Перечитайте пожалуйста непредвзято.
 
#include <JSON\json.mqh>

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


1.  Нет delete для созданного через new объекта типа JSONParser
Бессмысленный кастинг в JSONParser*
А чем вам не походит локальная переменная JSONParser? Или вы хотели использовать временный объект но не знаете его сигнатуру?

2. Бессмысленный кастинг в JSONObject*
3. Переменные jv и jobj точно не будет иметь значение NULL? Иначе удаление нулевого указателя в MQL будет печатать "мусор" в лог.

 
Sergey Dzyublik:


1.  Нет delete для созданного через new объекта типа JSONParser
Бессмысленный кастинг в JSONParser*
А чем вам не походит локальная переменная JSONParser? Или вы хотели использовать временный объект но не знаете его сигнатуру?

2. Бессмысленный кастинг в JSONObject*
3. Переменные jv и jobj точно не будет иметь значение NULL? Иначе удаление нулевого указателя в MQL будет печатать "мусор" в лог.

спасибо, это хоть что то

бессмысленный не применимо, этот способ использовал автор библиотеки, пока не вижу смысла писать другим способом вызовы для парсинга


с MQL не понятная ситуация при работе с указателями - разыменовывать их нельзя, когда указатель становится сущностью, а когда указателем на обьект - вообще черт ногу сломит (((

ЗЫ:  я 20 лет назад учил С++, в дальнейшем для инженеров на производстве он мало где используется, сначала почти все сидели на Делфи, потом на Шарп переползли, для контроллеров тоже не встречал где был бы применим С++, все на специализированом софте работает -  видимо отпечаток ВУЗов для студентов технических специальностей - там всегда начинают обучение с Паскаля, даже в Волгоградском политехе читают турбо-паскать...фиг его знает где берут компиляторы ))))


ЗЫ: холивар удалите, он не красит, обычно наоборот

 
Igor Makanu:

спасибо, это хоть что то

бессмысленный не применимо, этот способ использовал автор библиотеки, пока не вижу смысла писать другим способом вызовы для парсинга


с MQL не понятная ситуация при работе с указателями - разыменовывать их нельзя, когда указатель становится сущностью, а когда указателем на обьект - вообще черт ногу сломит (((

ЗЫ:  я 20 лет назад учил С++, в дальнейшем для инженеров на производстве он мало где используется, сначала почти все сидели на Делфи, потом на Шарп переползли, для контроллеров тоже не встречал где был бы применим С++, все на специализированом софте работает -  видимо отпечаток ВУЗов для студентов технических специальностей - там всегда начинают обучение с Паскаля, даже в Волгоградском политехе читают турбо-паскать...фиг его знает где берут компиляторы ))))


ЗЫ: холивар удалите, он не красит, обычно наоборот

Да нет тут указателей) Для класса есть хэндл, да работа с ним похожа на работу с указателем, но на этом все общее и заканчивается.

Теперь по выделенному:

  • Объект ты создаешь либо на стеке, либо в куче
    CTest test;             //test - object
    CTest* test=new CTest;  //test - handle of object
    ,при выходе из области видимости, в первом случае, компилятор неявно добавляет вызов деструктора при этом, никакая память не чистится, просто указатель стека возвращается в позицию до вызова функции. Во втором случае, при выходе из области видимости, память занятая объектом, остается для менеджера памяти отмеченной, как занятая, а так как ни один указатель на нее уже не указывает, то и освободиться она не может (это и называется утечкой памяти), поэтому надо явно уничтожать объект через delete.
  • Что касается местного run-time. Здесь handle, если нет перегруженной специально для него функции, неявно разыменовывается, пример:
    class CTest{
    };
    
    void OnStart()
      {
       CTest test;
       CTest* _test=new CTest;
       Test(test);
       Test(&test);
       Test(_test);
       _Test(_test);
       delete _test;
      }
      
    void Test(CTest &test){Print("Object");}
    void Test(CTest* test){Print("Handle");}
    void _Test(CTest &test) {Print("Ok");}
    PS. Да, и забудьте Вы про шарп, вообще ничего общего)))
 

Vladimir Simakov:

PS. Да, и забудьте Вы про шарп, вообще ничего общего)))

не получится, к хорошему быстро привыкаешь, там все логично, если где накосячил - сразу VS подскажет, да и при выполнении кода - вышел из тела функции - просто забыл, ну максимум что насоздавал присвоишь NULL - сам уберет ))

спасибо, буду размышлять

 
Igor Makanu:

не получится, к хорошему быстро привыкаешь, там все логично, если где накосячил - сразу VS подскажет, да и при выполнении кода - вышел из тела функции - просто забыл, ну максимум что насоздавал присвоишь NULL - сам уберет ))

спасибо, буду размышлять

Ага, только в дебрях кода осталась жить одна грустная неявная ссылка на объект (например вызов метода в invoke листе какого-то делегата) и приплыли, память потекла. В шарпе тоже накосорезить на раз-два.

Причина обращения: