Почему новый экземпляр класса CObject имеет не пустое значение?

 

 Нужно протестировать некоторые вещи. Вот написал в скрипте типа такого:

  CArrayObj *array = new CArrayObj;
  Print("arraySize = ", array.Total());

  // Добавили в массив 10 элементов
  for (int i = 0; i < 10; i++)
    array.Add(new CObject);

  for (int i = 0; i < array.Total(); i++) {
    Print("Object[", i, "] = ", array.At(i));
  }

Исполняю скрипт. Вижу такое:

2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[0] = 131072
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[1] = 196608
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[2] = 262144
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[3] = 327680
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[4] = 393216
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[5] = 458752
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[6] = 524288
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[7] = 589824
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[8] = 655360
2018.04.26 12:44:47.482 testMethod (BTCUSD,M1)  Object[9] = 720896
Откуда там значения эти взялись на каждой итерации? Я же не принтовал, как я понимаю, адреса на места в памяти, а всего навсего значения объекта на заданном месте. Других вариантов не нашёл в иерархии. Тогда почему там не пусто? Интересно, что видна некоторая закономерность возрастания значений объектов.
 
hoz:

 Нужно протестировать некоторые вещи. Вот написал в скрипте типа такого:

Исполняю скрипт. Вижу такое:

Откуда там значения эти взялись на каждой итерации? Я же не принтовал, как я понимаю, адреса на места в памяти, а всего навсего значения объекта на заданном месте. Других вариантов не нашёл в иерархии. Тогда почему там не пусто? Интересно, что видна некоторая закономерность возрастания значений объектов.

Очистку от мусора программист должен делать самостоятельно.

 
Alexey Viktorov:

Очистку от мусора программист должен делать самостоятельно.

Что-то я ни в CArrayObj, ни в CObject не нашёл для этого методов. Циклом что-ли пробежаться и присвоить пустые значения?

Как-то так проапдейтить?

  CArrayObj *array = new CArrayObj;
  Print("arraySize at initialize = ", array.Total());

  // Добавили в массив 2 элемента
  for (int i = 0; i < 2; i++)
    array.Add(new CObject);

  Print("arraySize after adding elements = ", array.Total());

  for (int i = 0; i < 2; i++)
    array.Update(i, NULL);

Хотя, не помогло. Странно, вроде как NULL передал, а на выходе всё-равно:

2018.04.26 13:44:18.863 testMethod (BTCUSD,M1)  arraySize after updating value of elements = 131072
2018.04.26 13:44:18.863 testMethod (BTCUSD,M1)  arraySize after updating value of elements = 196608
 
hoz:

 Нужно протестировать некоторые вещи. Вот написал в скрипте типа такого:

Исполняю скрипт. Вижу такое:

Откуда там значения эти взялись на каждой итерации? Я же не принтовал, как я понимаю, адреса на места в памяти, а всего навсего значения объекта на заданном месте. Других вариантов не нашёл в иерархии. Тогда почему там не пусто? Интересно, что видна некоторая закономерность возрастания значений объектов.

По-моему, все верно.

Ты на каждой итерации берешь указатель на объект и выводишь на печать. Понятно, что в указателе - содержится какой-то идентификатор типа адреса - ты его и получаешь. Что не так ?

Во втором варианте - вобще безбашенные действия - ты наплодил объектов, присвоил их адреса указателям в массиве, а потом - эти указатели обнуляешь. А объекты кто удалять будет ? Они у тебя в памяти так и останутся ?


Что, собственно, должен делать скрипт ? Создавать кучу объектов, и заносить указатели на них в массив ? Это - есть, и, судя по всему, правильно исполняется. А что еще надо ?

 
Georgiy Merts:

По-моему, все верно.

Ты на каждой итерации берешь указатель на объект и выводишь на печать. Понятно, что в указателе - содержится какой-то идентификатор типа адреса - ты его и получаешь. Что не так ?

Во втором варианте - вобще безбашенные действия - ты наплодил объектов, присвоил их адреса указателям в массиве, а потом - эти указатели обнуляешь. А объекты кто удалять будет ? Они у тебя в памяти так и останутся ?


Что, собственно, должен делать скрипт ? Создавать кучу объектов, и заносить указатели на них в массив ? Это - есть, и, судя по всему, правильно исполняется. А что еще надо ?

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

Там объекту можно было присвоить значение грубо говоря любого примитива обёрнутого в "оболочку".

Как мне что-то присвоить объекту в мкл вообще? Например, строку или число любое. Я понимаю, что число это не объект, но есть в Яве такое типа new Integer(value). Это уже объект. Так иной раз проще работать на много и проверять какие-то вещи.

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

 
hoz:

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

Там объекту можно было присвоить значение грубо говоря любого примитива обёрнутого в "оболочку".

Как мне что-то присвоить объекту в мкл вообще? Например, строку или число любое. Я понимаю, что число это не объект, но есть в Яве такое типа new Integer(value). Это уже объект. Так иной раз проще работать на много и проверять какие-то вещи.

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

Смотри.

СObject - это пустой объект, фактически, представляющий собой "неизвестный объект списка".

С указателями на такой объект умеет работать CArrayObj

Соответственно, тебе надо описать свой класс, пронаследованный от CObject.

В этом твоем объекте - должна быть описана функция заполнения. Можно перегрузить оператор присваивания и/или можно объявить конструктор копирования.

Далее, создаешь по new  очередной экземпляр своего объекта, заполняешь его с помощью этой функции (или создаешь от другого объекта, если у тебя есть конструктор копирования), а указатель - передаешь в CArrayObj.

Далее - у тебя будет массив таких указателей. И когда тебе нужно будет один из этих объектов присвоить заново - ты возьмешь указатель на него, и у указателя - вызовешь функцию заполнения содержимого.

 
Alexey Viktorov:

Очистку от мусора программист должен делать самостоятельно.

Это не мусор, это псевдоуказатели, которые уникальны для каждого *CObject. В C++ это были бы адреса памяти, в MQL4/5 дескрипторы, которые генерит рантайм.

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