И снова указатели на объекты. Ошибка при работе с ними

 

В классе есть указатель на библиотеку логирования. (m)

В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало. 

m = GetPointer(mO);

Запускаю робот, и меняю объект в классе на свой указатель

new U()

Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.

При смене тайм фрейма  получаю ошибку. Без смены все нормально при работающем роботе.  

2022.08.17 18:02:10.528 LineEnter (Si-9.22,M1)  invalid pointer access in 'OrderSendTsLab.mqh' (4040,7)

Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?

Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?

Конструктор библиотеки повторно не вызывается? Куда девается базовый объект? 

 
vbymrf:

В классе есть указатель на библиотеку логирования. (m)

В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало. 

Запускаю робот, и меняю объект в классе на свой указатель

Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.

При смене тайм фрейма  получаю ошибку. Без смены все нормально при работающем роботе.  

Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?

Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?

Конструктор библиотеки повторно не вызывается? Куда девается базовый объект? 

Было бы понятнее, если бы Вы приложили код, который можно скомпилировать и воспроизвести ошибку.
 

а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??

считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"

указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.

 
Maxim Kuznetsov #:

а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??

считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"

указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.

private:
MessageOS         mO;

Просто уже балдею от этих ошибок. Воспроизведу позже в простом ввиде. И проверю. Мне, C# не приходилось сталкиваться с таким. Главное постоянно какие то плавающие ошибки.  Там кода на 5000 строчек уже наплодил. И пошло поехало. 

 
vbymrf:

В классе есть указатель на библиотеку логирования. (m)

В момент вызова конструктора этого класса в этот указатель записывает объект mO Что бы точно что то там лежало. 

Запускаю робот, и меняю объект в классе на свой указатель

Интересное получается. Если обращение к m идет до замещения (т.е. смотря куда вставить строчку). Где лежит базовый объект, а не замещенный указатель.

При смене тайм фрейма  получаю ошибку. Без смены все нормально при работающем роботе.  

Но там уже лежит mO. Или новый. Ничего не лежать не может. Что делает смена тайм фрема?

Если же заместить до обращения - смена тайм фрема не приводит к ошибке. Что происходит?

Конструктор библиотеки повторно не вызывается? Куда девается базовый объект? 

На всякий случай:

"При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются."

https://www.mql5.com/ru/docs/runtime/running

 
Sergey Gridnev #:
Было бы понятнее, если бы Вы приложили код, который можно скомпилировать и воспроизвести ошибку.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class M
  {
public:
   void              func(string str)
     {
      Print(str);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class O
  {
public:
                     O(int i=0) {m=GetPointer(mO);};
   M*                m;
private:
   M                 mO;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
O o;
M* u;
int OnInit()
  {
   o.m.func("1 Hello");
   u=o.m = new M();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  
delete u;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 o.m.func("2 Hello");

  }

Вот вам код. Гарантированно приводит к ошибке при смене тайм фрейма. 

 
Maxim Kuznetsov #:

а что за объект mO ? у него какое время жизни..Где создаётся, где удаляется ??

считайте что указатель, это просто указатель. Если то на что он указывал развалилось, то обращение приведёт к ошибке, "invalid pointer"

указатели непричём. Скорее возможно недопонимание времени жизни объектов, глобальные/локальные/статические/динамические.

Да я оказался прав. Конструктор повторно не вызывается при смене тайм фрейме. Или что то другое - но сомнительно. Привел код выше

Если объявление 

O o;
M* u;
 вставить   в OnInit - ошибки нет. Значит это конструктор не вызвался
 
vbymrf #:

Вот вам код. Гарантированно приводит к ошибке при смене тайм фрейма. 

в школу нах...учить C/C++ до того как пытаться блеснуть. 

В плюсах - ровно то-же самое, если объект delete то обращение по его адресу seg.fault

 
vbymrf #:

Вот вам код. Гарантированно приводит к ошибке при смене тайм фрейма. 

Ну, так в ондеините удалился объект, на который указывала ссылка. При следующем за ним онините идёт обращение через недействительную ссылку.
 
vbymrf #:

Да я оказался прав. Конструктор повторно не вызывается при смене тайм фрейме. Или что то другое - но сомнительно. Привел код выше

Если объявление 

 вставить   в OnInit - ошибки нет. Значит это конструктор не вызвался
При смене таймфрейма объект "o" не пересоздается, он остаётся таким, каким был до смены ТФ.
 
Maxim Kuznetsov #:

в школу нах...учить C/C++ до того как пытаться блеснуть. 

В плюсах - ровно то-же самое, если объект delete то обращение по его адресу seg.fault

этот форум и есть моя школа)) Не нервничайте 

Спасибо всем. разобрался
Причина обращения: