Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.027 c
2-1187766712
bss
2007-08-22 11:11
2007.09.16
TDataSet, содержащий данные не из БД, а из массива


3-1179312724
MZ
2007-05-16 14:52
2007.09.16
Импорт из *.dbf в FireBird


2-1187755040
Человек
2007-08-22 07:57
2007.09.16
Привязка к железу


15-1187483828
SerJaNT
2007-08-19 04:37
2007.09.16
Удалить строки


2-1188118767
ins
2007-08-26 12:59
2007.09.16
HexToInt