Ошибки, баги, вопросы - страница 3559

 
Aleksey Vyazmikin # :

Не понял, т.е. файл слишком большой и не хватило памяти ОЗУ? По факту файл не большой и уменьшается в процессе работы скрипта.

Вот функция чтения - раньше не замечал подобных сообщений - активно использую не менее года.

Это именно проблема. Извините, но я не буду проверять ваш код, у меня нет на это времени.

Разработчики MetaQuotes знают о сообщении «VirtualAlloc», и я полагаю, что они улучшат его в будущем. Но проблемы можно избежать.

 
Alain Verleyen #:
Но проблемы можно избежать.

Как избежать?

 
Mickey Moose #:


, они по ходу как то связаны 

Они связаны против хода.

 
fxsaber #:

Вы использовали лайфхак преобразования указателя в объект. Выглядит, как ошибка языка, приводящая к ускорению.

Это не лайфхак, а задокументированная возможность

https://www.mql5.com/ru/docs/basis/types/object_pointers

void OnStart()
  {
//--- объявим указатель на объект и создадим его с помощью оператора 'new'
   Foo *foo2=new Foo("foo2");
//--- вариант передачи указателя на объект по ссылке
   PrintObject(foo2); // указатель на объект автоматически преобразуется компилятором  
  }

void PrintObject(Foo &object)
  {
   Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
  }
 
Vladislav Boyko #:

Это не лайфхак, а задокументированная возможность

Ошибка в документации. С template такое не прокатит, например.

 
fxsaber #:
Тем самым обнулив проверку указателя на каждой итерации цикла. Выглядит, как ошибка языка, приводящая к ускорению.

По логике вещей, указатель все равно будет единократно проверен при преобразовании.

class A
  {
public:
   const int id;
             A(int a_id) : id(a_id) {}
  };

void OnStart()
  {
   f((A*)NULL); // invalid pointer access
  }

void f(A& a)
  {
   Print(a.id);
  }

Следующий тест показывает, что при попытке удалить объект внутри метода, он будет удален только после выхода из метода (утечки памяти нет по итогу):

class A
  {
public:
   const int id;
             A(int a_id) : id(a_id) {}
  };

void OnStart()
  {
   A* a = new A(123);
   f(a);
  }

void f(A& a)
  {
   Print("#1 ", a.id);
   A* ptr = GetPointer(a);
   delete ptr;
   Print("#2 ", a.id);
  }

 
fxsaber #:

Ошибка в документации. С template такое не прокатит, например.

Я не считаю, что это ошибка. Постом выше я показал, что сломать эту механику не получится даже при желании.

Шаблонами не пользуюсь, не могу ничего сказать.

 
Vladislav Boyko #:

Я не считаю, что это ошибка.

Я некомпетентен, подожду комментариев.

Шаблонами не пользуюсь, не могу ничего сказать.

class A {};

template <typename T>
void f( T& ) { Print(__FUNCSIG__); } // void f<A*>(A*&)

void OnStart()
{
  A* a = NULL;
  
  f(a);
}

Не получается универсально преобразовать указатель в объект.

 
Vladislav Boyko #:
при попытке удалить объект внутри метода, он будет удален только после выхода из метода

Не совсем так, оказывается. Деструктор вызывается сразу, но к объекту можно обращаться после того, как выполнился деструктор. Не знаю, на сколько это корректно. Но с другой стороны, идею удалять там объект с помощью GetPointer адекватной точно не назовешь.

class A
  {
public:
   const int id;
             A(int a_id) : id(a_id) {}
             ~A() { Print(__FUNCTION__); }
  };

void OnStart()
  {
   A* a = new A(123);
   f(a);
  }

void f(A& a)
  {
   Print("#1 ", a.id);
   A* ptr = GetPointer(a);
   delete ptr;
   Print("#2 ", a.id);
  }



fxsaber #:
Не получается универсально преобразовать указатель в объект.

Я некомпетентен в шаблонах.

 
Alexey Viktorov #:

Они связаны против хода.

можно подробнее?