![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Finalize(); выдает ошибку...
GEEK © (2005-05-29 20:32:00)Когда освобождаю массив tstring-ов выдаеться ошибка: invalid pointer operation.
Как быть?
Alexander Panov (2005-05-29 23:03:00) [1]>GEEK
мда... тебе шашечки или ехать?
Palladin (2005-05-29 22:51:00) [2]
> GEEK (29.05.05 21:07) [17]
Чушь. Надо не 3, а 4. В некоторых случаях, неопределенных наукой, 5. Их нужно искать по собственному опыту. Кстати каждый кратный числу 17 номер дня относительно начала года нужно 8.
DiamondShark (2005-05-29 22:15:00) [3]
> Почему так?
Потому что у программиста в километре 1024 метра.
Marser (2005-05-29 21:11:00) [4]
>Вощем все правы, ошибка вот она:
>SetLength(arr,SG.RowCount-2);
> for i:=0 to SG.RowCount-2 do
>arr[i]:=TStringList.Create;
> А надо 3.
Тиць, п..ць, любий Гриць!
Почему так?
GEEK (2005-05-29 21:08:00) [5]А Finalize или SetLength(arr,0) можно не ставить ваще нигде!
GEEK (2005-05-29 21:07:00) [6]Вощем все правы, ошибка вот она:
SetLength(arr,SG.RowCount-2);
for i:=0 to SG.RowCount- 2do arr[i]:=TStringList.Create;
А надо 3.
Пасибо всем...
Alexander Panov (2005-05-29 21:05:00) [7]Просто проверь такой код:
var
arr: array of TStrings;
i: integer;
begin
SetLength(arr,10);
for i := Low(arr) to High(arr) do
begin
arr[i] := TStringList.Create;
arr[i].Add('dsfgdfg');
end;
for i := Low(arr) to High(arr) do
begin
arr[i].Free;
end;
SetLength(arr,0); // здесь можно уже и Finalize выполнить.
Alexander Panov (2005-05-29 21:03:00) [8]GEEK (29.05.05 21:01) [14]
Finalize не уничтожает объекты, на которые ссылаются элементы массива.
В справке написано, для каких типов это верно.
GEEK (2005-05-29 21:01:00) [9]
> Finalize + F1
В любом случае, если ничего не делать с массивом, при выходе программа виснет...
Alexander Panov (2005-05-29 21:00:00) [10]GEEK (29.05.05 20:55) [8]
В основном коде у тебя не все элементы массива проинициализированы, а уничтожить ты пытаешься все.
1. Вместо Finalize используй SetLength(arr,0).
2. Внимательно следи за создаваемыми и уничтожаемыми объектами.
GEEK (2005-05-29 20:59:00) [11]for i:=0 to High(arr) do arr[i].free;
Finalize(arr);
Теперь освобождаються все стринги, а потом освобождаеться массив...
Все равно ошибка...
Даже так:
for i:=0 to High(arr) do arr[i].destroy;
Finalize(arr);
Marser (2005-05-29 20:58:00) [12]Finalize + F1
Finalize simply sets all long strings to empty and all variants and interfaces to Unassigned, thus properly releasing any memory that was referenced by the long strings and variants.
If the variable specified in a call to Finalize contains no long strings, variants, or interfaces, the compiler eliminates the call and generates no code for it.
Alexander Panov (2005-05-29 20:57:00) [13]GEEK (29.05.05 20:56) [9]
Освобождаеться массив... Не?
Если не углуюляться в дебри, то да.
Но куда деваются элементы массива - TStrings?
GEEK (2005-05-29 20:56:00) [14]
> Что происходит при Finalize(arr)?
Освобождаеться массив... Не?
GEEK (2005-05-29 20:55:00) [15]
> Где Free?
for i:=0 to High(arr) do arr[i].free;
Finalize(arr);
так тоже не катит
Alexander Panov (2005-05-29 20:54:00) [16]Marser © (29.05.05 20:51) [5]
Это не причина ошибки...
Что происходит при Finalize(arr)?
Думаю, что ответ позволит решить основную проблему.
GEEK (2005-05-29 20:54:00) [17]
> Чему равно RowCount?(возможно, больше десяти).
> Почему to SG.RowCount-2 ?
>
> Сдаётся, у тебя просто выход за пределы динамического массива.
Сабж: Finalize() выдает ошибку
В цикле все нормально...
Еще при закрытии программы ошибка, но только если выполнялся код, который удалии (пасибо большое)...
Marser (2005-05-29 20:51:00) [18]
> Где Free?
Это не причина ошибки...
Alexander Panov (2005-05-29 20:50:00) [19]GEEK (29.05.05 20:38) [2]
:=TStringList.Create;
Где Free?
Marser (2005-05-29 20:47:00) [20]Чему равно RowCount?(возможно, больше десяти).
Почему to SG.RowCount- 2?
Сдаётся, у тебя просто выход за пределы динамического массива.