void f()
{
for ( int i = 0;; )
{
Print( i );
int i = 5; //Warning: declaration of 'i' hides local declarationPrint( i );
break;
}
}
void For( int i = 0 )
{
Print( i );
int i = 5; //Error: redefinition of formal parameter 'i'Print( i );
}
А какая принципиальная разница? В C++ например в обоих случаях ошибка
Прошу помочь знающих людей разобраться в вопросе указателей на экземпляры классов. А то я не въезжаю.
Имеем такой пример скрипта:
class A
{
public :
A() { Print("Start"); };
~A() {
Print("End");
Print(EnumToString(CheckPointer(GetPointer(this))));
if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC)
deleteGetPointer(this);};
};
A a;
voidOnStart()
{
}
2018.09.2321:46:42.960 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321:46:42.961 Test_CheckPointer (EURUSD,M1) 32 bytes of leaked memory
т.е. деструктор даже не запускается, память соответственно не освобождается.
Если же экземпляр класса объявляем так:
A a= new A;
то конструктор запускается два раза, деструктор 1 раз, но при этом память не освобождается и имеем тип указателя объекта POINTER_AUTOMATIC , хотя предпологалось POINTER_DYNAMIC
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) Start
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) End
2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) POINTER_AUTOMATIC2018.09.2321:54:24.844 Test_CheckPointer (EURUSD,M1) 1 undeleted objects left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 1 object of type A left
2018.09.2321:54:24.845 Test_CheckPointer (EURUSD,M1) 32 bytes of leaked memory
Как добиться всегда выполнения деструктора и правильного выполнения delete
Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
Tester optimization finished, total passes 10000
Statistics optimization done in 2 minutes 19 seconds
Два вывода
Incorrect-Init и ExpertRemove - одно и то же по скорости.
Пустой прогон в ~5 раз быстрее вылета из OnInit.
По второму пункту явно какая-то ошибка. Мне выгоднее по времени делать пустой прогон, нежели выскакивать из OnInit. Просьба поправить, т.к. почти полностью теряются преимущества Incorrect-Init и ExpertRemove.
Вкладка Избранное с советниками/индикаторами/скриптами и счетами запоминается только после выхода из Терминала. Из-за этого нештатный выход (электричество кончилось) сбрасывает эту вкладку. Возможно ли ее сохранять при изменении?
Иногда возникает четкое понимание, что было бы очень удобно, если бы в Избранное можно было бы добавлять папки.
В одном случае предупреждение, в другом ошибка
А какая принципиальная разница? В C++ например в обоих случаях ошибка
Прошу помочь знающих людей разобраться в вопросе указателей на экземпляры классов. А то я не въезжаю.
Имеем такой пример скрипта:
При выполнении имеем, как и предпологалось:
если экземпляр класса объявляем так:
A *a= new A;тогда при выполнении имеем:
т.е. деструктор даже не запускается, память соответственно не освобождается.
Если же экземпляр класса объявляем так:
A a= new A;то конструктор запускается два раза, деструктор 1 раз, но при этом память не освобождается и имеем тип указателя объекта POINTER_AUTOMATIC , хотя предпологалось POINTER_DYNAMIC
Как добиться всегда выполнения деструктора и правильного выполнения delete
Как добиться всегда выполнения деструктора и правильного выполнения delete.
Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/).
Может что есть в кодобазе...
Смотрите из С++ тему умных указателей и адаптируйте под MQL (https://habr.com/post/140222/).
Может что есть в кодобазе...
спасибо, но не увидел там ответов на мои вопросы.
Не понимаю, почему деструктор не вызывается при A *a= new A;
спасибо, но не увидел там ответов на мои вопросы.
Не понимаю, почему деструктор не вызывается при A *a= new A;
Результат:
1:POINTER_AUTOMATIC
1:POINTER_DYNAMIC
2:POINTER_DYNAMIC
2:POINTER_AUTOMATIC
спасибо, но не увидел там ответов на мои вопросы.
Не понимаю, почему деструктор не вызывается при A *a= new A;
Создаем оператором new, а удаляем оператором delete
спасибо, но не увидел там ответов на мои вопросы.
Не понимаю, почему деструктор не вызывается при A *a= new A;
https://www.mql5.com/ru/docs/basis/variables/object_live
Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Прошу MQL проверить функцию OnTimer().
Почему-то она не работает в тестере стратегий для МТ4 (Ошибок нет, просто ничего внутри этой функции не выполняется), при этом в онлайне все Ок.
Для МТ5 функция работает как в тестере, так и в онлайне.
Спасибо!
В OnInit только два числа сравниваются, а времени на Incorrect-проход уходит больше, чем на полноценный проход! Как так?
Запускаем на полную Оптимизацию вот такой советник
Получаем результат работы 8-ми Агентов
Теперь такой советник
Наконец, такой
Два вывода
По второму пункту явно какая-то ошибка. Мне выгоднее по времени делать пустой прогон, нежели выскакивать из OnInit. Просьба поправить, т.к. почти полностью теряются преимущества Incorrect-Init и ExpertRemove.
Вкладка Избранное с советниками/индикаторами/скриптами и счетами запоминается только после выхода из Терминала. Из-за этого нештатный выход (электричество кончилось) сбрасывает эту вкладку. Возможно ли ее сохранять при изменении?
Иногда возникает четкое понимание, что было бы очень удобно, если бы в Избранное можно было бы добавлять папки.