Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c