Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1185099170
Владимир Макарович
2007-07-22 14:12
2007.08.19
Вопросы по программированию


15-1184873242
Petr V. Abramov
2007-07-19 23:27
2007.08.19
Автомобили "Бентли" и "Ягуар" не сооветствуют


15-1179751582
Dimon777
2007-05-21 16:46
2007.08.19
BDE+Paradox+Vista: Кто нибудь пробовал?


15-1185232100
Kostafey
2007-07-24 03:08
2007.08.19
С днем рождения ! 24 июля


2-1185219808
Новичеек
2007-07-23 23:43
2007.08.19
convert vartostr





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский