Вопросы от "чайника" - страница 106

 
uncleVic:
Задачка... Приложите пожалуйста модуль сигнала (у меня такого нет). Будем посмотреть.
Файлы:
 
openlive:

Ещё более странно. У меня эффект не воспроизводится.
 
uncleVic:

Ещё более странно. У меня эффект не воспроизводится.

эффект только при инициализации, в тестере все нормально

ну ладно, не надо ковырять, мне это особо не нужно 

 

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

Если значения есть в буфере ,то почему не рисует опять же... 

 

 

Добрый день, просба объяснить следующее:

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

 Есть у меня два класса, полагаю что экземпляр следующего поколения ( base -  child -  child2 - ...), занимает в памяти все больше места. Оператору New, мы точно говорим сколько выделить памяти, передавая класс в параметрах. Но в оператору delete, ничего о том, сколько нужно удалять, мы не говорим. Исходя из этих размышлений не совсем ясно что будет в следующей ситуации:

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

Т.е. я о том, что мы объявили  *pClass как указатель на Cbase (маленький класс по сравнению с  Cchild), но фактически он указывает на  Cchild. От сюда вопрос, как поведет себя  delete()? Освободит количество байт равное размеру  Cbase (тогда память будет засоряться), или удаление произойдет правильно?

 P.S: ну за одно по вопрос по теме: существует ли в выделенном участке памяти (new) какая то метка, при помощи которой можно понять размер этого участка (что-то вроде того как хранится char с нуль-терминатором в конце)? Или другими словами, сможет ли участок кода ничего не знающий о том какие размеры у объявленных мною классов корректно освободить память?

 

220Volt:

От сюда вопрос, как поведет себя  delete()? Освободит количество байт равное размеру  Cbase (тогда память будет засоряться), или удаление произойдет правильно?

конечно же удалит правильно. можете брикпоинты раскидать по деструкторам

P.S: ну за одно по вопрос по теме: существует ли в выделенном участке памяти (new) какая то метка, при помощи которой можно понять размер этого участка (что-то вроде того как хранится char с нуль-терминатором в конце)? Или другими словами, сможет ли участок кода ничего не знающий о том какие размеры у объявленных мною классов корректно освободить память?

sizeof ?
 
sergeev:

конечно же удалит правильно. можете брикпоинты раскидать по деструкторам

У этого вопроса ноги примерно оттуда и растут. Сделал примерно так как описал (деструктор был не виртуальный), и деструкторы ниже класса-указателя не вызывались.
 
sergeev:
sizeof ?
Я думаю что sizeof работает на этапе компиляции, а я говорю об освобождении памяти например из другого процесса. Если это возможно, тогда думаю станет понятна работа функции delete.
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
Деструкторы в MQL5 всегда виртуальные. Удаляется всё правильно, попробуйте проставить Print(__FUNCSIG__); в деструкторах.

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
Вопрос даже больше не о том что мы навыделяли в функциях класса через new, а о данных класса его "коренных" членах. Ведь они тоже не пустое место.
Причина обращения: