Текущий архив: 2007.09.16;
Скачать: CL | DM;
ВнизДинамические массивы Найти похожие ветки
← →
Lera (2007-08-24 10:21) [0]Доброе утро! Уменя такая проблема: обнуляю заполнененный динамический массив, каждая ячейка которого содержит разичные параметры разных типов - DnMas:=nil. Возникает ошибка "Invalid pointer operation". Пробовала FreeAndNil(DnMas), та же ошибка. Подскажите что делать? Может как-то по другому обнулять. Заранее спасибо.
← →
Юрий Зотов © (2007-08-24 10:29) [1]FreeAndNil - это для объектов. Массив - не объект.
DnMas := nil - это обнуление ссылки на массив (а динамический массив ссылкой и представляется), но не его элементов. Само собой, после обнуления ссылки любое обращение к ней (т.е., к массиву) даст эту самую ошибку.
Обнулить элементы масива можно или в цикле, или так:
var
DnMas: packed array of тип_элемента;
ZeroMemory(DnMas, Length(DnMas) * SizeOf(тип_элемента));
← →
Vlad Oshin © (2007-08-24 12:28) [2]q1:=gettickcount;
for i:=0 to 9999999 do
begin
k:=length(a);
setlength(a,0);
setlength(a,k);
a[0]:=123;
a[9]:=321;
end;
q2:=gettickcount;
V1:=q2-q1;
q1:=gettickcount;
for i:=0 to 9999999 do
begin
ZeroMemory(a, Length(a) * SizeOf(i));
a[0]:=123;
a[9]:=321;
end;
q2:=gettickcount;
V2:=q2-q1;
v1>v2 в 4 раза..
почему..
ведь
в1: говорим, размер =0, потом говорим нет, лучше как было
в2: Заполнить массив 0. понимаю что там асм
наверное, машина сама делает v2 неявно?
← →
Юрий Зотов © (2007-08-24 12:58) [3]> Vlad Oshin © (24.08.07 12:28) [2]
В v2 нет перевыделения памяти, в v1 - есть. Коипилятор - не ИИ и не волшебник, он не знает, что в v1 память можно не перераспределять.
← →
Sapersky (2007-08-24 13:56) [4]DnMas: packed array of тип_элемента;
packed, вроде, не обязательно, они всегда такие.
наверное, машина сама делает v2 неявно?
Делает. Ну и перераспределение памяти - всегда медленно.
← →
Макс Черных © (2007-08-24 17:21) [5]
> DnMas := nil - это обнуление ссылки на массив (а динамический
> массив ссылкой и представляется), но не его элементов.
Но это только когда есть еще другие ссылки на массив. А если оных больше нет, то указатель на массив пойдет в процедуру finalize. Которая как раз и зачистит память.
> обнуляю заполнененный динамический массив, каждая ячейка
> которого содержит разичные параметры разных типов
Вот в этом разных типов и зарыта собака. В массиве по уму должны быть элементы одного типа (array of TYPE). А если используется например явное приведение типов ( ТmyType(Еlement) ), или выделение памяти руками и т.п. то и очищать надо руками.
finalize, увы, не всегда может понять, что же там такое программер наваял. :)
Страницы: 1 вся ветка
Текущий архив: 2007.09.16;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.048 c