Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / New - Dispose / 8 сообщений из 8, страница 1 из 1
22.12.2020, 09:01
    #40030019
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
Когда выделяется память с помощью New(PMyRec), то тип записи где-нибудь сохраняется?
Это я к тому, что при освобождении через Dispose - обязательно использовать типизированный указатель или нет?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  Rec: PMyRec; // указатель на запись с Managed-типами
  Ptr: Pointer;
begin
  New(Rec);
  Ptr := Rec;
  Dispose(Ptr); // Так можно (в плане Finalize)?
end;
...
Рейтинг: 0 / 0
22.12.2020, 09:06
    #40030022
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
alekcvp
то тип записи где-нибудь сохраняется?

Не тип, но размер.
...
Рейтинг: 0 / 0
22.12.2020, 09:31
    #40030030
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
wadman
alekcvp
то тип записи где-нибудь сохраняется?

Не тип, но размер.

Размер понятно, но ведь для того чтобы корректно освободить запись с полями, например, string - Dispose вызывает Finalize(). А той требуется TypeInfo. А как она узнает о типе указателя?
...
Рейтинг: 0 / 0
22.12.2020, 09:43
    #40030033
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
alekcvp
Когда выделяется память с помощью New(PMyRec), то тип записи где-нибудь сохраняется?

Кто мешает посмотреть в исходнике?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function _New(Size: NativeInt; TypeInfo: Pointer): Pointer;
begin
  GetMem(Result, Size);
  if Result <> nil then
    _Initialize(Result, TypeInfo);
end;

procedure _Dispose(P: Pointer; TypeInfo: Pointer);
begin
  _Finalize(P, TypeInfo);
  FreeMem(P);
end;
...
Рейтинг: 0 / 0
22.12.2020, 09:47
    #40030035
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
softwarer
alekcvp
Когда выделяется память с помощью New(PMyRec), то тип записи где-нибудь сохраняется?

Кто мешает посмотреть в исходнике?

Код: pascal
1.
2.
3.
4.
5.
procedure _Dispose(P: Pointer; TypeInfo: Pointer);
begin
  _Finalize(P, TypeInfo);
  FreeMem(P);
end;


Посмотрели? Отлично, вот это вот
Код: pascal
1.
procedure _Dispose(P: Pointer; TypeInfo: Pointer);


откуда берётся, если вызывается Dispose(Ptr) или Dispose(Rec)?..
...
Рейтинг: 0 / 0
22.12.2020, 09:51
    #40030037
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
alekcvp
откуда берётся, если вызывается Dispose(Ptr) или Dispose(Rec)?..

Оттуда же, откуда берётся при вызове New. Неужели сложно догадаться? Считай, что где-то объявлено

Код: pascal
1.
2.
3.
// магия компилятора
#define New(P) _New(P, TypeInfo(P))
#define Dispose(P) _Dispose(P, TypeInfo(P))


Короче говоря, тот код, который ты написал выше - отработает без видимых ошибок, но финализации не сделает и память, соответственно, потеряет.
...
Рейтинг: 0 / 0
22.12.2020, 09:55
    #40030040
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
softwarer
Короче говоря, тот код, который ты написал выше - отработает без видимых ошибок, но финализации не сделает и память, соответственно, потеряет.

Ну вот это меня и интересовало, спасибо.
...
Рейтинг: 0 / 0
22.12.2020, 10:23
    #40030046
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
New - Dispose
Легче было протрейсить
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / New - Dispose / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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