Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

InvalidPointer   Найти похожие ветки 

 
zep   (2007-07-26 22:11) [0]

Доброго времени суток,
есть такая проблема я выделяю память процедурой new для структуры, заполняю ее поля и занашу указатель на нее несколько раз в Tlist затем при выполнении Dispose первый раз память высвобождается нормально а при повторной попытке выполнить Dispose вылетает ошибка InvalidPointer. Как узнать что указатель указывает на уже удаленный объект.
зарание спосибо.


 
Desdechado ©   (2007-07-26 22:23) [1]

Никак. Только запоминать, какие уже очищены, а какие - нет. Или nil указателю присваивать.


 
Leonid Troyanovsky ©   (2007-07-26 22:48) [2]


> Desdechado ©   (26.07.07 22:23) [1]

>  Или nil указателю присваивать.

Или - не годится.

> zep   (26.07.07 22:11)  
> Dispose вылетает ошибка InvalidPointer. Как узнать что указатель
> указывает на уже удаленный объект.

Вместо записей пользовать TComponent (and Notification method, override).
Т.е., держатель ссылки обниляет ее при получении opRemove.

--
Regards, LVT.


 
zep   (2007-07-26 22:54) [3]

Leonid Troyanovsky а можно поподробней, нилить указатель не получится в Tliste записан один и тотже уазатель если один занилить то в другом Item" се он останется


 
Leonid Troyanovsky ©   (2007-07-26 23:12) [4]


> zep   (26.07.07 22:54) [3]

> не получится в Tliste записан один и тотже уазатель если
> один занилить то в другом Item" се он останется

Дейс-но, ссылок-то несколько :)

Можно и без компонентов (но, не изменяя принципу) -
отсортируй список и ниль пока совпадает с разрушаемым.

--
Regards, LVT.


 
zep   (2007-07-26 23:36) [5]

А какойнить функции проверки нет, dispose же выдает ошибку он же как то проверяет, пробывал отлавливать try except при включении опции компелятора {$I+} это становится возможным он отлавливает ее один раз в обработке excepta я делаю continue но при следующей итерации цикла он уже нечего не отлавливает просто вешает приложение.


 
zep   (2007-07-26 23:38) [6]

запоминать указатели я уже думал, это простой но накладный метод там просто сотни тысячь записей и сразу идти по этому способу не хотолось бы


 
palva ©   (2007-07-27 00:07) [7]

Перед освобождением памяти писать какую-нибудь бяку в первые байты. Есть надежда, что эта бяка может быть прочитана после освобождения памяти и послужит признаком, что память уже освобождена. Но если алгоритм не сразу все освобождает, но в промежутке еще и запрашивает память, то может не сработать.


 
Leonid Troyanovsky ©   (2007-07-27 09:25) [8]


> zep   (26.07.07 23:38) [6]

> запоминать указатели я уже думал, это простой но накладный
> метод там просто сотни тысячь записей и сразу идти по этому
> способу не хотолось бы

А зачем запоминать, если указатели и так в списке?
Т.е., при (перед) освобождении памяти для удаляемой записи
проходим по списку и обниляем (удаляем) все указатели на нее.

Ну, а для х тысяч записей полезно список отсортировать (TList.Sort).

--
Regards, LVT.


 
Desdechado ©   (2007-07-27 11:04) [9]

Leonid Troyanovsky ©
Логическое противоречие, не находите?

>>  Или nil указателю присваивать.
>Или - не годится.
?
> проходим по списку и обниляем (удаляем) все указатели на нее.

Я ведь об этом говорил.


 
Sonia ©   (2007-07-27 11:07) [10]


> Как узнать что указатель указывает на уже удаленный объект.

Выполнить пошагово код и через watches посмотреть значение.


 
Инс ©   (2007-07-27 11:16) [11]

В самом деле, рекомендую от записей перейти к классам (не экономьте, экземпляр класса всего-то на 4 байта больше) а заодно посмотрите, как организован класс TComponent и список TComponentList. Там ваша проблема решается.


 
Инс ©   (2007-07-27 11:16) [12]

В самом деле, рекомендую от записей перейти к классам (не экономьте, экземпляр класса всего-то на 4 байта больше) а заодно посмотрите, как организован класс TComponent и список TComponentList. Там ваша проблема решается.


 
Leonid Troyanovsky ©   (2007-07-27 11:57) [13]


> Desdechado ©   (27.07.07 11:04) [9]

> Я ведь об этом говорил.

Я вопрос прочитал невнимательно.
Sorry.

--
Regards, LVT.


 
palva ©   (2007-07-27 13:37) [14]


> zep   (26.07.07 23:36) [5]
>
> А какойнить функции проверки нет, dispose же выдает ошибку
> он же как то проверяет, пробывал отлавливать try except
> при включении опции компелятора {$I+} это становится возможным
> он отлавливает ее один раз в обработке excepta я делаю continue
> но при следующей итерации цикла он уже нечего не отлавливает
> просто вешает приложение.

Ничего он не проверяет, и вообще говоря, проверить невозможно. Он пробует освобождать, а после этого может произойти все что угодно. Иногда исключение иногда зацикливание, иногда просто неправильная работа, которая может остаться незамеченной. Указатели на освобожденную память использовать нельзя, даже для чтения. Вот я написал такой пример:

{$APPTYPE CONSOLE}
type
 PR = ^TR;
 TR = record
   a, b: Integer;
   c: Char;
 end;
var
PR1, PR2, PR11, PR3, PR4: PR;
begin
 New(PR1);
 New(PR2);
 PR11 := PR1;
 { Два указателя на одну и ту же запись }
 Dispose(PR1);
 { Теперь по идее PR11 - тоже невалидный указатель }
 New(PR3); // третья запись встала на место первой
 PR3^.c := "3";
 WriteLn(Integer(PR1));  // 8585220
 WriteLn(Integer(PR2));  // 8585236
 WriteLn(Integer(PR11)); // 8585220
 WriteLn(Integer(PR3));  // 8585220
 Dispose(PR11); // Думаем, что удаляем первую запись.
 { Думали, в случае чего перехватить Exception }
 New(PR4); // Как вы догадались, теперь PR4 = PR3
 PR4^.c := "4";
 WriteLn(PR3^.c); // 4
 { А мы ведь положили туда 3 :-( }
end.

Вот и попробуйте найти ошибку в так написанной программе.


 
Игорь Шевченко ©   (2007-07-27 13:59) [15]


> есть такая проблема я выделяю память процедурой new для
> структуры, заполняю ее поля и занашу указатель на нее несколько
> раз в Tlist затем при выполнении Dispose первый раз память
> высвобождается нормально а при повторной попытке выполнить
> Dispose вылетает ошибка InvalidPointer


Я бы добавил в структуру поле "Удален" и при удалении устанавливал бы его в true. А собственно удаление отложил бы.
Сборка мусора-с



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
2-1185515132
zod
2007-07-27 09:45
2007.08.19
Как правильно удалить компонеты ?


8-1163235073
Cool Boy
2006-11-11 11:51
2007.08.19
Как у TAgent -а


1-1181179291
Igor_K_A
2007-06-07 05:21
2007.08.19
Обработка Bitmap двумя Thread


15-1184917426
Sonia
2007-07-20 11:43
2007.08.19
Der beste Deutschland Stadt


15-1184818917
THandle
2007-07-19 08:21
2007.08.19
На компьютере почему - то не работает звук