powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [weak] и FastMM
18 сообщений из 18, страница 1 из 1
[weak] и FastMM
    #40010558
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такие классы
Код: 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.
type
  IChild = interface;

  IParent = interface
    ['{5CF4EEDB-C8BE-4EDF-B604-F2902A08A007}']
    function GetChild: IChild;
  end;

  IChild = interface
    ['{5CF4D571-2C04-4B15-923B-E8D7D79DE4F6}']
    function GetParent: IParent;
  end;

  TParent = class(TInterfacedObject, IParent)
  strict private
    FChild: IChild;
  strict protected
    function GetChild: IChild;
  public
    constructor Create;
  end;

  TChild = class(TInterfacedObject, IChild)
  strict private
    [Weak]
    FParent: IParent;
  strict protected
    function GetParent: IParent;
  public
    constructor Create(const AParent: IParent);
  end;

{ TParent }

constructor TParent.Create;
begin
  inherited Create;
  FChild := TChild.Create(Self);
end;

function TParent.GetChild: IChild;
begin
  Result := FChild;
end;

{ TChild }

constructor TChild.Create(const AParent: IParent);
begin
  inherited Create;
  FParent := AParent;
end;

function TChild.GetParent: IParent;
begin
  Result := FParent;
end;



И вызов
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm1.Button1Click(Sender: TObject);
var
  LParent: IParent;
begin
  LParent := TParent.Create;
  LParent := nil;
end;


При использовании FastMM после закрытия программы появляется сообщениеFastMM has detected a FreeMem call after FastMM was uninstalled.

Причина в том, что в финализации модуля System дергается такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function TInstItem.Free: Boolean;
var
  H: Integer;
begin
  Result := @Self <> nil;
  if Result then
  begin
    ClearWeakRefs;
    for H := 0 to Length(FBuckets)-1 do
      ArrayOfPointerClear(@FBuckets[H]);
    for H := 0 to Length(FMethodBuckets)-1 do
      ArrayOfPointerClear(@FMethodBuckets[H]);
    FLock.Destroy;
    Dispose(PInstItem(@Self));
  end;
end;

Вызов Dispose и вызывает ошибку. Кто-то знает, как с этим бороться?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010561
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас увидел, что [Unsafe] такой проблемы не вызывает. В принципе для моего проекта такая замена допустима, но хотелось бы найти решение для [weak]
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010582
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

а версия Delphi какая? вроде пишут что с берлина ввели, а раньше для ARC работала
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010589
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010604
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 10.4.1 с FastMM5 не воспроизводится.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010607
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
На 10.4.1 с FastMM5 не воспроизводится.
После нажатия на кнопку? Потому что если не создавать TParent, то проблемы тоже нет.

У меня 10.3.1 и FastMM4.

Можешь поставить брекпойнт на TInstItem.Free и посмотреть, вызывается ли он при финализации модуля? И сам код функции такой же?
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010620
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
После нажатия на кнопку?

Разумеется.

_Vasilisk_
И сам код функции такой же?

Изменён вызов освобождения памяти. Делается прямой вызов дельфийского MM:
Код: pascal
1.
SysFreeMem(@Self);
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010629
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде я это в QC кидал: https://quality.embarcadero.com/browse/RSP-16796
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010642
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они, кажись, тупо не везде Dispose поменяли на SysFreeMem в 10.2 и 10.3 и довели до ума только в 10.4.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010663
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Fastmm4 есть define который отключает это сообщение.
Типа разрешить освобождать память после отключения менеджера памяти.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010666
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
довели до ума только в 10.4.
И то радует
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010667
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014
В Fastmm4 есть define который отключает это сообщение.
При этом память будет освобождена совсем не тем менеджером, который ее выделил
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010678
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
ziv-2014
В Fastmm4 есть define который отключает это сообщение.
При этом память будет освобождена совсем не тем менеджером, который ее выделил

А при завершении работы приложения - не пофиг ли?
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010680
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
_Vasilisk_
пропущено...
При этом память будет освобождена совсем не тем менеджером, который ее выделил

А при завершении работы приложения - не пофиг ли?

Можно хороший зависон получить.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010782
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
ziv-2014
В Fastmm4 есть define который отключает это сообщение.
При этом память будет освобождена совсем не тем менеджером, который ее выделил

Если память будет освобождена не тем менеджером, то мы должны получить AV. Но этого не происходит.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010787
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014
Если память будет освобождена не тем менеджером, то мы должны получить AV
ну это на совести аллокатора, от реализации
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010816
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
ziv-2014
Если память будет освобождена не тем менеджером, то мы должны получить AV
ну это на совести аллокатора, от реализации


Код: pascal
1.
2.
3.
4.
5.
class function TInstItem.Create: PInstItem;
begin
  Result := SysAllocMem(SizeOf(Result^));
  Result.FLock := TMonitor.Create;
end;


SysAllocMem вызывает стандартный менеджер памяти.
...
Рейтинг: 0 / 0
[weak] и FastMM
    #40010844
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014
SysAllocMem вызывает стандартный менеджер памяти
в данной ситуации роляет реализация SysFreeMem и там уж как фишка ляжет
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [weak] и FastMM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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