powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
25 сообщений из 226, страница 5 из 10
Улучшил FreeAndNil. Можете не благодарить.
    #39954244
alekcvp,

Да хватит пургу гнать. В команде всякое бывает. Классы могут крашитья по разным причинам. Освобождение тоже может происходить спонтанно из за освобождения логики определённого юнита хаотичным образом, из за порядка подключения.

Да куча вообще есть подводных комней, почему лучше удалить с пометкой указателя на null


Вот один пример - порча памяти приложения

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    for I := 0 to T.UnitCount - 1 do
    begin
      len := PByte(p)^;
      if len <> 0 then
      begin
        SetLength(UnitList[I], len);
        len2 := Utf8ToUnicode(@UnitList[I][1], len + 1, @p[1], len);
        if len2 > 0 then
          SetLength(UnitList[I], len2 - 1)
        else
          UnitList[I] := '';
      end;

      Inc(p, sizeof(Byte));
      Inc(p, len);
    end;



Данный код хаотично начинал крашить обращения к компонентам, очень долгое время непонятно было почему приложение вылетало.

Подправив его вот так, у нас перестали крашиться обращения к классам хаотичным образом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Offset := 0;
    for I := 0 to UnitsCount - 1 do
    begin
      len := PByte(NativeInt(P) + Offset)^;
      if len = 0 then
        Continue;

      Inc(Offset, 1);

      SetLength(Units[I], len);
      Move(Pointer(NativeInt(P) + Offset)^, Units[I][1], len);

      Inc(Offset, len);
    end;

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954245
Надо мыслить на много шире. Приведённые примеры не означают что будет именно так. Так как в действительности - в реальных условиях, я бы даже сказал в суровых. Детская фантазия не всегда поможет. Постоянно может возникать что - то, о чём вы даже не могли и предположить.

Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас.

Я могу предположить что у вас просто нехватка реального опыта с разными проблемами в настоящих проекта (Не подделках в детском саду)
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954246
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Постоянно может возникать что - то, о чём вы даже не могли и предположить.

Это говорит о недостатке опыта вкупе с тягой к экспериментам.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954247
rgreat,

Шаблоньюзер
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954248
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Постоянно может возникать что - то, о чём вы даже не могли и предположить.
Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас.

Когда в приложении происходит хрен знает что и вы вообще не представляете что там и где освобождается, то проблема не во FreeAndNil, а в архитектуре приложения...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954267
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, rgreat

ВсеРазумный в данном случае ох как прав
когда у вас под контролем будет 7-8 проектов где каждый заходит и топчет, тогда начнёте дуть на воду
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954329
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Разница в том, что вы зачем-то используете Utf8ToUnicode куда надо передавать какие-то указатели...

А мы работаем с высокоуровневым кодом, и делаем это проще через
Код: pascal
1.
2.
var SourceBuffer, TargetBuffer: TBytes;
TargetBuffer := TEncoding.Convert(TEncoding.UTF8, TEncoding.Unicode, SourceBuffer);



Современная дельфи уже давно в некоторых местах позволяет забыть об указателях...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954338
X-Cite,

Данный код, кто - то вытянул из Delphi какой - то версии. В последней версии, вроде как стоит
Код: pascal
1.
2.
3.
    p := Pointer(FTypeInfo^.UnitNames);
    for i := 0 to FTypeInfo^.UnitCount - 1 do
      Result[i] := ReadShortString(p);




Проблема не в Utf8ToUnicode, ибо она была ликвидирована в первую очередь по такой же причине. Спойлер - проблема не исчезла.

Код: pascal
1.
 P := Pointer(T.UnitNames);



В оригинале, в Delphi коде делался inc на переменную P дабы разграничить секции. И каким - то образом, двигался не Pointer указателя, а именно сам UnitNames.

Код: pascal
1.
UnitNames: _PShortStr; { concatenation of Pascal strings, one for each unit }




Хотя, в новой реализации функция ReadShortString тоже двигает указатель.

Странно это.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954370
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Не вижу свзи между безопастностью и freeandnil.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954425
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

не видишь, предложи замену
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954427
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
try
  X.Free;
finally
  X:=nil;
end;


Ошибки обработать по желанию/необходимости.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954437
По моему вы преувеличиваете

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Test = class
    procedure Test;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;
  Test1: Test;

implementation

{$R *.dfm}

procedure ExceptionCall;
begin
  Raise Exception.Create('Исключение пифеца');
end;

procedure Test.Test;
begin
  ExceptionCall;
end;

destructor Test.Destroy;
begin
  Test;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Try
    FreeAndNil(Test1);
  Except
    on E: Exception do
      ShowMessage(E.ClassName + ' ошибка с сообщением : ' + E.Message);
  end;

  if Test1 = nil then
    ShowMessage('Обнулён');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Test1 := Test.Create;
end;

end.




Объект обнулён в любом случае.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954438
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
kealon(Ruslan),

Код: pascal
1.
2.
3.
4.
5.
try
  X.Free;
finally
  X:=nil;
end;


То есть, если в программе пятьсот мест, где нужно подобным образом освободить объект, Вы пятьсот раз напишете этот код? Или же таки оформите процедуру и вызовете её пятьсот раз?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954439
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Как я уже сказал я крайне редко обнуляю указатели как таковые ибо считаю это непрямым и как следствие ненадежным методом контроля состояния объекта.
Ссылок на объект может быть больше одной.

У меня в 99% случаев nil в указателе может быть только до иннициализации объекта.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954440
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объекты я убычно убиваю вместе с бизнес логикой и всеми ссылками, которе на него ссылаются.

Так проверять на валидность ничего и не надо.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954442
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Как я уже сказал я крайне редко обнуляю указатели как таковые

Вы не ответили на вопрос. Руслан Вас спросил, Вы предложили метод, я задал вопрос про этот метод. В нём нет ничего про крайне редко или крайне часто, в нём только про методику использования предложенного Вами метода.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954445
Как показала практика, для обнуление объекта try не нужно. И со всеми задачи справляется FreeAndNil




А если нужен try то и FreeAndNil со всем справляется.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954446
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнуление переменной до Destroy делается совсем не для обработки исключений. Исключений в деструкторе вообще быть не должно. Это делается, чтобы во время уничтожения объект был недостижим через ссылку, потому что он находится уже в неконсистентном состоянии. Для многих ситуаций это критически важно, и если ссылку не обнулить _до_ Destroy программа будет глючить.

Конечно, в первую очередь это имеет смысл для интерфейсов - обнуление интерфейсной переменной работает так-же как FreeAndNil - для объектов обнуляемая ссылка не факт, что последняя и объект может быть достижим через другие ссылки. Но тем не менее - это принципиальный момент.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954451
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,

А кто сказал, что обнуление переменной до Destroy делается для обработки исключений?
Эк, вас всех, парни, однако, разобралО.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954452
Vlad F,

Раз 22126803
Два 22127835


В общем тут каждый друг друга путает, наводит кипишь на пустом месте. И из маленькой пылинки раздувает опухоль со слона.

Мифы создают
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954453
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954455
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

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

Такое мнение.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954456
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov
Исключений в деструкторе вообще быть не должно. .
А бывают.
Я у себя в сервисах try-ями обкладываю вообще все.
Даже то что сломаться якобы не может.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954457
rgreat,

Я буду прост. - Это диагноз.


Vlad F
Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли.


Переборщили с вами.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39954458
В общем кого - то надо отправить повторно изучать Try-Except-on&do ибо я сейчас пытаюсь вызвать исключение в конструкторе с выкидом в деструктор, и в нём же созданием исключения разными способами.

И Try-Except-on&do справляется с отловом исключения через овер 100 функций и классов, находя место исключения с использованием разного в том числе и FreeAndNil c пометкой EInvalidPointer с сообщением : Invalid pointer operation


Проблем нет, кривизна функции FreeAndNil не доказана. А польза 100% тем более это inline и не является функцией в рабочем коде.
...
Рейтинг: 0 / 0
25 сообщений из 226, страница 5 из 10
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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