Если вы декларируете массив с помощью операции new, вы должны сообщить об этом объекту GCPtr, указав размер массива при объявлении этого объекта. Далее приведен пример, в котором выделяется память для массива из 5 элементов типа double. GCPtr<double. 5> pda = new double[5] ; Размер следует задать по двум причинам. Во-первых, вы известите конструктор объекта типа GCPtr о том, что создаваемый объект будет указывать на размещенный массив, что вызовет установку значения true в поле isArray. Если это поле равно true, функция collect () будет очищать память с помощью операции deleted, которая предназначена для удаления размещенного в динамической памяти массива, в отличие от операции delete, используемой для уничтожения одиночного объекта. Следовательно, в приведенном примере, когда pda выходит за пределы видимости, применяется операция deleted и все пять элементов массива будут удалены. Уверенность в том, что нужное количество элементов уничтожается, особенно важна, когда массивы из объектов размещаются в динамической памяти. Только используя операцию delete [ ], вы можете быть уверены, что для каждого объекта из массива будет вызван деструктор. Во-вторых, указание размера массива препятствует обращению к элементу, находящемуся за границами массива, во время обработки его элементов в цикле с помощью объекта iter. Напоминаю, что размер массива (хранящийся в поле arraySize) передается через объект GCPtr конструктору объекта типа iter, как только последний потребуется. Знайте, что в языке нет строгого правила, по которому динамически размещаемый массив может обрабатываться только с помощью объекта GCPtr, указывающего на массив. Его соблюдение — целиком на вашей ответственности. После того как вы разместили массив в динамической памяти, есть два способа доступа к его элементам. Во-первых, вы можете индексировать объект типа GCPtr, который на него указывает. Во-вторых, можно воспользоваться итератором. Далее показаны оба способа доступа.
|