powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / New - Dispose
8 сообщений из 8, страница 1 из 1
New - Dispose
    #40030019
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда выделяется память с помощью 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
New - Dispose
    #40030022
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
то тип записи где-нибудь сохраняется?

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

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

Размер понятно, но ведь для того чтобы корректно освободить запись с полями, например, string - Dispose вызывает Finalize(). А той требуется TypeInfo. А как она узнает о типе указателя?
...
Рейтинг: 0 / 0
New - Dispose
    #40030033
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
New - Dispose
    #40030035
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
New - Dispose
    #40030037
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
New - Dispose
    #40030040
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Короче говоря, тот код, который ты написал выше - отработает без видимых ошибок, но финализации не сделает и память, соответственно, потеряет.

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


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