Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Правильная проверка объекта на существование, альтернатива Assigned(... / 25 сообщений из 62, страница 1 из 3
02.07.2021, 12:33
    #40081357
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Всем доброго дня,

столкнулся с ошибкой в чужом коде, попыткой вызвать Free у несуществующего объекта. Перед этим проводится проверка через Assigned(...) и проверку проходит.
Возник вопрос, как правильно проверить обьект на существование? <> nil не подходит, Аssigned( тоже.

Спасибо
...
Рейтинг: 0 / 0
02.07.2021, 12:40
    #40081364
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Никак. Нужно просто знать поток выполнения программы и время жизни объекта в ней.

PS: Для объектов с неопределённым временем жизни применяют счётчики ссылок (и
синхронизацию если многопоточность).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:42
    #40081366
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Нужно правильно уничтожать объект. Например, с помощью FreeAndNil()
...
Рейтинг: 0 / 0
02.07.2021, 12:43
    #40081368
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun> Возник вопрос, как правильно проверить обьект на существование?

А что значит "проверить обьект на существование" ?

hlopotun> <> nil не подходит, Аssigned( тоже.

Почему же, для проверки переменной вполне сгодится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 12:54
    #40081374
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun
попыткой вызвать Free у несуществующего объекта. Перед этим проводится проверка через Assigned(...) и проверку проходит.
Для вызова Free никакие проверки не нужны. Все уже реализовано в самой Delphi
...
Рейтинг: 0 / 0
02.07.2021, 13:58
    #40081399
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun,

для вызова Free никакие проверки не нужны. а вот несуществующий объект должен иметь адрес nil всегда
...
Рейтинг: 0 / 0
02.07.2021, 14:23
    #40081409
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun,

попробуйте заменить в этом проекте где возможно xyz.Free на FreeAndNil(xyz)
...
Рейтинг: 0 / 0
02.07.2021, 15:30
    #40081426
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Гаджимурадов Рустам

.......
А что значит "проверить обьект на существование" ?
.......

был он создан через Create или нет.
В данном случае просто устранил проблему инициализировав переменную с nil сразу после обьявления.
Была мысль что если система понимает в момент вызова что объект не сушествует и происходит обращение к чужой памяти то логично было бы иметь возможность определить это из программы тоже не вызывая исключения.
...
Рейтинг: 0 / 0
02.07.2021, 15:43
    #40081430
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun

В данном случае просто устранил проблему инициализировав переменную с nil сразу после обьявления.

А что, сразу после объявления она не nil ?
...
Рейтинг: 0 / 0
02.07.2021, 15:49
    #40081434
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
02.07.2021 15:43, DimaBr пишет:
> А что, сразу после объявления она не nil ?

смотря где объявлять
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 16:15
    #40081439
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun> был он создан через Create или нет.

А как ещё можно его создать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 16:24
    #40081441
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Гаджимурадов Рустам
hlopotun> был он создан через Create или нет.

А как ещё можно его создать?

можно просто не создать или не вернуть итп тут как раз это и произошло.
...
Рейтинг: 0 / 0
02.07.2021, 20:55
    #40081491
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
hlopotun,

Все предложенные способы Free, FreeAndNil Не будут работать, так как если на объект ссылаются из разных мест по указателю,
То во всех этих местах, кроме владельца из которого объект дестроится, останется мусорный указатель, который нет возможности проверить на корректность.
Я в своем приложении использую регистрацию объектов, на которые нужно безопасно ссылаться, а объект, который ссылается хранит не указатель, а индекс в этом реестре. Объект, на который ссылается, при дестрое удаляет себя из этого реестра. Объект, который ссылается, при обращении по индексу на сдестроенный объект, гарантированно получит nil.
Бывают и другие схемы, например объект хранит список ссылок на объекты, которые он должен оповестить о дестрое, но они более ресурсоемкие. Подозреваю что ссылки с атрибутом [weak] в новых версиях реализованы под капотом так. В ненагруженном приложении можно использовать такой вариант.
...
Рейтинг: 0 / 0
02.07.2021, 22:22
    #40081502
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2> Объект, на который ссылается, при
swame2> дестрое удаляет себя из этого реестра.

До или после удаления? И сам (в деструкторе)
или некий удалятор (класс-хранитель, видимо) ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 23:56
    #40081508
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Гаджимурадов Рустам,

В своем деструкторе.
...
Рейтинг: 0 / 0
03.07.2021, 00:45
    #40081512
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2,

Чего только люди не придумают, чтобы интерфейсы не пользовать...
...
Рейтинг: 0 / 0
03.07.2021, 15:08
    #40081532
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2> В своем деструкторе.

И что, невозможна ситуация, когда часть деструктора отработала,
а до удаления из реестра дело не дошло (или наоборот)?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2021, 21:22
    #40081554
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
DarkMaster,

>>Чего только люди не придумают, чтобы интерфейсы не пользовать...

Интерфейсы тут вообще не при чем. Ссылка на интерфейс может также иметь мусорный указатель, особенно плохо что такие ошибки нестабильно воспроизводятся. На днях как раз правил чужой баг с запомненным указателем на интерфейс сдестроенного объекта, проявлявшийся только на 1 компе. Стабильно воспроизводится только с FastMM в отладочном режиме.

Если имеется в виду наследники TInterfacedObject, когда когда объект дестроится только после того, как освобождены все ссылки, то в моем случае такой подход не приемлем, нужно по ходу работы нужно освобождать коллекции из сотен тысяч, миллионов объктов, а на какие из этих объектов ведут ссылки из десятков подсистем, отследить нереально. В результате утечек - да , не будет, но объекты будут висеть несдестроенными до конца работы приложения, память закончится.
...
Рейтинг: 0 / 0
03.07.2021, 21:25
    #40081556
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Гаджимурадов Рустам,

swame2> В своем деструкторе.

И что, невозможна ситуация, когда часть деструктора отработала,
а до удаления из реестра дело не дошло (или наоборот)?

Наверное возможна теоретически, когда в деструкторе допущены грубые ошибки, но в моем приложении именно эта проблема за примерно 10 лет массового применения ни разу не возникала, ошибки в деструкторе, если есть, дадут знать о себе раньше.
...
Рейтинг: 0 / 0
03.07.2021, 22:02
    #40081558
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2...объект, который ссылается хранит не указатель, а индекс в этом реестре...
...по ходу работы нужно освобождать коллекции из сотен тысяч, миллионов объктов...


В таком случае твой реестр должен постоянно расти из-за невозможности повторного использования индекса,
и в конце концов реестр может переполниться.

Как решается эта проблема?
...
Рейтинг: 0 / 0
03.07.2021, 22:24
    #40081561
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Aleksandr Sharahov,

индекса int64 хватит на годы аптайм приложения. По столько его не используют.
Для большинства практических применений, с аптаймомом а несколько недель, хватит и Cardinal или integer.
Была мысль использовать разные реестры для разных документов, каждый со своим набором индексов.
Но в моем случае это влечет сложности, не решился делать.
Также используются свои реестры для разного типа объектов
...
Рейтинг: 0 / 0
03.07.2021, 22:33
    #40081562
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2
Aleksandr Sharahov,

индекса int64 хватит на годы аптайм приложения. По столько его не используют.
Для большинства практических применений, с аптаймомом а несколько недель, хватит и Cardinal или integer.
Была мысль использовать разные реестры для разных документов, каждый со своим набором индексов.
Но в моем случае это влечет сложности, не решился делать.
Также используются свои реестры для разного типа объектов


Можно подробнее:
- как объявлен реестр?
- как он расширяется?
- сколько объектов в день создается?
...
Рейтинг: 0 / 0
03.07.2021, 22:48
    #40081563
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Aleksandr Sharahov,

Так реестр

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  TUIDHeap = class (TRDictionary<longword,TObject>)
  private
    FLastID: IDUID;
    FLock: TCriticalSection;
    TotalTypesCounter: TClassStat;
    procedure ShowLeaks;
  protected
    function GetID (AItem: TObject): integer;
  public
    constructor Create(aUseTotalCounter: Boolean); reintroduce; virtual;
    destructor Destroy; override;
    procedure LockList; inline;
    procedure UnLockList; inline;
    procedure Add(O: TObject); overload;
    procedure AddUnique(O: TObject);
    procedure Add(AUID: IUID); overload;
    procedure Add(AUID: IUID; OUID: TObject); overload;
    procedure Remove(O: TObject);
    procedure IPut(const P: LongWord; O: TObject);
    function GetTByID<T:class> (const ID: IDUID): T; inline;
    function Contains (const AUID: IUID): boolean;
    function GetByID(const ID: IDUID): TObject; overload; //inline;
    function NextID: IDUID;
    function Print: string;
    function PrintCounts: string; //override;
  end;




Так ссылка на объект

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  TIDHeapRef<T:class> = record
  private
    FUID: int64;
    function GetObject: T;
    procedure SetObject(const Value: T);
  public
    constructor Create (const UID: int64); overload;
    constructor Create (const intfUID: IUID); overload;
    procedure Clear;
    procedure FreeObject;
    function A: boolean;
    function NA: boolean;
    function AO(var Obj:T): boolean;
    function GetInterface (const IID: TGUID; out Obj): Boolean;
    class operator Implicit(ref: TIDHeapRef <T>): T;
    class operator Implicit(Obj: T): TIDHeapRef <T>;
    class operator Implicit(ref: TIDHeapRef <T>): Boolean;
    class operator LogicalNot(ref: TIDHeapRef <T>): Boolean;
    class operator LogicalAnd(a: TIDHeapRef <T>; b: Boolean): Boolean;
    class operator LogicalAnd(a: Boolean; b: TIDHeapRef <T>): Boolean;
    class operator LogicalOr(a: TIDHeapRef <T>; b: Boolean): Boolean;
    class operator LogicalOr(a: Boolean; b: TIDHeapRef <T>): Boolean;
    class operator Equal(a, b: TIDHeapRef <T>): boolean; overload;
    class operator Equal(a: TIDHeapRef <T>; b: T): boolean; overload;
    class operator Equal(a: T; b: TIDHeapRef <T>): boolean; overload;
    property O: T read GetObject write SetObject;
    property ID: int64 read FUID;
  end;


...
Рейтинг: 0 / 0
03.07.2021, 22:49
    #40081564
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
Aleksandr Sharahov,

>> сколько объектов в день создается?

В документе от нескольких десятков тысяч до нескольких миллионов объектов.

Есть несколько приложений , у них разный режим работы.
Есть редактор, в нем обычно открыто несколько документов, его обычно запускают 1 раз или несколько раз в день.

Есть клиент, в нем может быть открыто одновременно до нескольких десятков документов, пока хватает памяти в 3Гб 32 битного клиента, аптайм несколько дней-недель. Документы могут открывать - закрывать наверное десятки раз в день. Время открытия большого документа, который на миллионы объектов 10-20 сек.
...
Рейтинг: 0 / 0
03.07.2021, 22:55
    #40081565
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильная проверка объекта на существование, альтернатива Assigned(...
swame2,

ясно, я как раз хотел порекомендовать использовать хеш-таблицу
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Правильная проверка объекта на существование, альтернатива Assigned(... / 25 сообщений из 62, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]