Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [weak] и FastMM / 18 сообщений из 18, страница 1 из 1
21.10.2020, 16:10
    #40010558
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
Есть такие классы
Код: 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
21.10.2020, 16:16
    #40010561
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
Сейчас увидел, что [Unsafe] такой проблемы не вызывает. В принципе для моего проекта такая замена допустима, но хотелось бы найти решение для [weak]
...
Рейтинг: 0 / 0
21.10.2020, 16:38
    #40010582
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
_Vasilisk_,

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

У меня 10.3.1 и FastMM4.

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

Разумеется.

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

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

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

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

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

Если память будет освобождена не тем менеджером, то мы должны получить AV. Но этого не происходит.
...
Рейтинг: 0 / 0
22.10.2020, 09:50
    #40010787
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
ziv-2014
Если память будет освобождена не тем менеджером, то мы должны получить AV
ну это на совести аллокатора, от реализации
...
Рейтинг: 0 / 0
22.10.2020, 11:21
    #40010816
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
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
22.10.2020, 12:33
    #40010844
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[weak] и FastMM
ziv-2014
SysAllocMem вызывает стандартный менеджер памяти
в данной ситуации роляет реализация SysFreeMem и там уж как фишка ляжет
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [weak] и FastMM / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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