ООП. Вопросы применения - страница 14

 
Yedelkin:

"Invalid pointer access" == "Попытка к обращения к некорректному указателю"? Если да, то

 Указатель может быть некорректным в следующих случаях:

  • указатель равен NULL;
  • если объект был уничтожен при помощи оператора delete.

Первый вариант мой случай.

Я бы с радостью использовал CheckPointer() и остальные способы проверки (не в чера родился вроде), но снос эксперта с графика недает мне на это шансов.

Уточню - стоит в конструкторе указать что указатель равен NULL и при этом прекратить с ним всякие действия эксперт получает 281 и вылетает (а по моей задумке не должен).

Если же после конструктора вызвать Init или InitXXX (по аналогии с CExpert) все работает как надо...

 
Interesting:

Первый вариант мой случай.

Я бы с радостью использовал CheckPointer() и остальные способы проверки (не в чера родился вроде), но снос эксперта с графика недает мне на это шансов.

Уточню - стоит в конструкторе указать что указатель равен NULL и при этом прекратить с ним всякие действия эксперт получает 281 и вылетает (а по моей задумке не должен).

Если же после конструктора вызвать Init или InitXXX (по аналогии с CExpert) все работает как надо...


А была бы обработка исключений - Вы могли бы очень легко понять, в чем дело, и отработать ситуацию.
 
Interesting:

Первый вариант мой случай.

Я бы с радостью использовал CheckPointer() и остальные способы проверки (не вчера родился вроде), но снос эксперта с графика недает мне на это шансов.

Уточню - стоит в конструкторе указать что указатель равен NULL и при этом прекратить с ним всякие действия эксперт получает 281 и вылетает (а по моей задумке не должен).

Если же после конструктора вызвать Init или InitXXX (по аналогии с CExpert) все работает как надо...

 

Я пока не разбирался с методами Init или InitXXX, но сам по себе "снос эксперта с графика" интерпретировал бы так: программа в процессе своего выполнения натыкается на некорректный указатель и нужно искать именно это узкое место в коде. У меня конструктор тоже инициализирует указатель NULLем, но ничего не вылетает.

Если не так понял суть вопроса - сорри. 

 
Interesting:

Спасибо, теперь все стало на свои места. Но, есть дополнительный вопрос - Допустим если возникает ошибка 281, но при этом желательно чтобы советник не выгружался. Как быть тогда?

Уточню вопрос - Как быть если 281 ошибка возникает после выполнения всех этапов инициализации, но на основную работу эксперта это не повлияет настолько критически чтобы его совсем не запускать?

Обработки исключений не будет.

Выход один - не использовать некорректные указатели.

Если есть вероятность (отличная от нуля) того, что указатель может быть некорректным, обязательно проверьте его перед использованием.

 
uncleVic:

Обработки исключений не будет.

Выход один - не использовать некорректные указатели.

Если есть вероятность (отличная от нуля) того, что указатель может быть некорректным, обязательно проверьте его перед использованием.


Вероятность (отличная от нуля) того, что указатель может быть некорректным, есть АБСОЛЮТНО ВСЕГДА!

Поэтому необходимо всегда проверять его валидность перед КАЖДЫМ использованием! А не только после создания.

Не всегда, но в критических участках я так и делаю :(


Охренеть, во что превращается чистый прозрачный код :) при использовании Вашей рекомендации.

 
Yedelkin:

Я пока не разбирался с методами Init или InitXXX, но сам по себе "снос эксперта с графика" интерпретировал бы так: программа в процессе своего выполнения натыкается на некорректный указатель и нужно искать именно это узкое место в коде. У меня конструктор тоже инициализирует указатель NULLем, но ничего не вылетает.

Если не так понял суть вопроса - сорри. 

Если речь идёт о классе CExpert, тонужно вызвать хотя-бы Init(...). Там  все указатели инициализируются как указатели на объекты базовых классов..
 
falkov:

Вероятность (отличная от нуля) того, что указатель может быть некорректным, есть АБСОЛЮТНО ВСЕГДА!

Поэтому необходимо всегда проверять его валидность перед КАЖДЫМ использованием!

Не всегда, но в критических участках я так и делаю :(


Охренеть, во что превращается чистый прозрачный код :) при использовании Вашей рекомендации.

Альтернатива: Иметь чистый прозрачный код, вылетающий по Invalid pointer?
 
uncleVic:
Альтернатива: Иметь чистый прозрачный код, вылетающий по Invalid pointer?

Альтернатива: Иметь чистый прозрачный код.

По Invalid pointer и другим исключительным ситуациям (отключение питания, место на диске и др. ИСКЛЮЧИТЕЛЬНЫМ ситуациям) программа идет в блок обработки исключений, где уважаемый Интерестинг (и я тоже :) мог бы вывести значения переменных и ошибку на печать, проанализировать ситуацию и понять, в чем проблема. И, если в этом блоке нет реакции на случившееся, вывалиться.

Естественно, это не отменяет стандратные и нужные проверки. Речь идет ТОЛЬКО ОБ ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЯХ

 
uncleVic:
Если речь идёт о классе CExpert, тонужно вызвать хотя-бы Init(...). Там  все указатели инициализируются как указатели на объекты базовых классов..

Скажем если Init или InitXXX выполнится с ошибкой (вернет false), что тогда?

Или что делать если во время выполнения эксперт всеже (при всех проверках и заморочках) получает 281, а трейдера рядом нет?

falkov:

А была бы обработка исключений - Вы могли бы очень легко понять, в чем дело, и отработать ситуацию.

Ну нет ее, так нужной обработки. проверки есть, почти на каждом шагу, а вот обработки к сожалению нет...

PS

Так на счет вылета эксперта с графика - что сделать для того чтобы эксперт при инициализации оставался "живым" в любом составлении?

 
uncleVic:
Альтернатива: Иметь чистый прозрачный код, вылетающий по Invalid pointer?

Так в том-то и дело что вылетающий, позвольте "мне" самому решать следует в этом случае снести эксперта или нет.

Ведь речь даже не идет о том что "битый" указатель где-то применяется, хотя лично у меня есть проверка перед его применением (хотя могу еще проверку в таймере реализовать).

С индикаторами я как-то научился жить в согласии и результат от ник ИНВАЛИДНОСТИ в процессе инициализации как-то не сильно волнует, а вот с указтелями подружиться подобным образом не выходит.

Yedelkin:

Я пока не разбирался с методами Init или InitXXX, но сам по себе "снос эксперта с графика" интерпретировал бы так: программа в процессе своего выполнения натыкается на некорректный указатель и нужно искать именно это узкое место в коде. У меня конструктор тоже инициализирует указатель NULLем, но ничего не вылетает.

Если не так понял суть вопроса - сорри. 

Для реализации поставленной задачи в настоящее время я в блоке инициализации тупо возвращаю 0, при помощи

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

Как я понял для меня это лучший выход из ситуации (чтобы эксперт при инициализации не вылетал). Т.е. в любом случае результат OnInit = 0,насколько это правильный судит не берусь.

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