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

 
Dmitry Fedoseev:
Указатель можно и не по ссылке передавать - без &.
Можно. Только если передать указатель без &, то на стеке создается новый указатель, которому присваивается переданное значение. При этом, если мы выделяем в функции память по этому указателю, то меняется  указатель именно тот, который создан на стеке, соответственно, при "размотке" стека получаем утечку памяти. Так делать конечно не хорошо, но если человеку хочется...
 
Vladimir Simakov:
то меняется  указатель именно тот, который создан на стеке, соответственно, при "размотке" стека получаем утечку памяти. Так делать конечно не хорошо, но если человеку хочется...

поведение указателей на классы в MQL не предсказуемое, кто то из админов когда то писал, что все классы создаются в глобальной памяти (выделение памяти), Вы пишете, что указатели на классы в локальной видимости создаются в стеке (имхо, так и должно быть!) 

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

 
Vladimir Simakov:
Можно. Только если передать указатель без &, то на стеке создается новый указатель, которому присваивается переданное значение. При этом, если мы выделяем в функции память по этому указателю, то меняется  указатель именно тот, который создан на стеке, соответственно, при "размотке" стека получаем утечку памяти. Так делать конечно не хорошо, но если человеку хочется...

Не будет никакой утечки. Потому что в функции никто ничего не выделяет для этого указателя.

 
Igor Makanu:

поведение указателей на классы в MQL не предсказуемое, кто то из админов когда то писал, что все классы создаются в глобальной памяти (выделение памяти), Вы пишете, что указатели на классы в локальной видимости создаются в стеке (имхо, так и должно быть!) 

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

Если память выделяется динамически (new), то она выделяется в куче, а если вы создаете объект на стеке (CObj obj;), то и память ему выделяется тоже на стеке.

 
Dmitry Fedoseev:

Не будет никакой утечки. Потому что в функции никто ничего не выделяет для этого указателя.

void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Классическая утечка. Указателю созданному на стеке и инициализированному при создании значением, переданным в функцию, присвоили новое значение и он стал указателем на новый объект. После чего указатель благополучно был убит при раскрутке стека. Что и требовалось доказать. Вот как раз тут и должно быть:

void CreateLabel(CChartObjectLabel* &l,string name,int y)
 
Vladimir Simakov:

Если память выделяется динамически (new), то она выделяется в куче, а если вы создаете объект на стеке (CObj obj;), то и память ему выделяется тоже на стеке.

В mql такого нет - (CObj obj;)

 
Vladimir Simakov:

Классическая утечка. Указателю созданному на стеке и инициализированному при создании значением, переданным в функцию, присвоили новое значение и он стал указателем на новый объект. После чего указатель благополучно был убит при раскрутке стека. Что и требовалось доказать. Вот как раз тут и должно быть:

Божий дар с яичницей не путайте. Тем более идиотский код писать для подтверждения ошибочного заявления...

 
Dmitry Fedoseev:

В mql такого нет - (CObj obj;)

Да ладно! То-то постоянно использую.
 
Vladimir Simakov:
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }

Классическая утечка. Указателю созданному на стеке и инициализированному при создании значением, переданным в функцию, присвоили новое значение и он стал указателем на новый объект. После чего указатель благополучно был убит при раскрутке стека. Что и требовалось доказать. Вот как раз тут и должно быть:

А для чего вы нарочно переназначили указатель, переданный в функцию ? Конечно будет утечка. Но это не "классическая утечка", а классическая ошибка работы с указателем на объект.

Здесь не нужно создавать новый объект, а работать нужно с внешним объектом, указатель на который передан в функцию.

 
Vladimir Simakov:
Да ладно! То-то постоянно использую.

Где? В каком месте и каким образом?

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