Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки при двойном рейзе? / 22 сообщений из 22, страница 1 из 1
21.07.2017, 21:59:46
    #39493179
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
Выполняем функцию, внутри которой может возникнуть какой угодно эксепшн
В качестве результата функции - возникший эксепшн или nil

В определённый момент рейзим вернувшийся эксепшн
Получаем утечку памяти
Воспроизведение:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function Func: Exception;
begin
  Result := nil;
  try
    System.Error(reInvalidPtr);
  except
    on E: Exception do
    begin
      Result := Exception.Create(E.Message);
    end;
  end;
end;

procedure Test;
var
  E: Exception;
begin
  E := Func;
  if (E <> nil) then
    raise E;
end;



Что я неправильно понимаю в эксепшнах?
...
Рейтинг: 0 / 0
21.07.2017, 22:14:34
    #39493188
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
SOFT FOR YOU,

"Tokyo" 10.2, утечку памяти не подтверждаю (контролировал с помощью указания ReportMemoryLeaksOnShutdown := True;).
...
Рейтинг: 0 / 0
21.07.2017, 22:19:30
    #39493192
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
SOFT FOR YOU,
А чего бы не возвращать E.Message?..
...
Рейтинг: 0 / 0
21.07.2017, 22:23:56
    #39493195
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvpSOFT FOR YOU,
А чего бы не возвращать E.Message?..

Разве вопрос был про архитектуру? У него объект исключения после возбуждения эксцепшна автоматом не удаляется.
...
Рейтинг: 0 / 0
21.07.2017, 22:24:43
    #39493196
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvp,

В оригинале копируется не текст, а весь эксепшн, с классом и внутренним содержимым
Но это совсем другая история )
...
Рейтинг: 0 / 0
21.07.2017, 22:25:55
    #39493197
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччД,

Пробую Берлин, утечка воспроизводится

Код: 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.
program TestPr;

uses
  SysUtils;

function Func: Exception;
begin
  Result := nil;
  try
    System.Error(reInvalidPtr);
  except
    on E: Exception do
    begin
      Result := Exception.Create(E.Message);
    end;
  end;
end;

procedure Test;
var
  E: Exception;
begin
  E := Func;
  if (E <> nil) then
    raise E;
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  IsConsole := False;
  Test;
end.
...
Рейтинг: 0 / 0
21.07.2017, 22:27:42
    #39493198
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччДSOFT FOR YOU,

"Tokyo" 10.2, утечку памяти не подтверждаю (контролировал с помощью указания ReportMemoryLeaksOnShutdown := True;).

Также, не подтверждаю утечку на D2007.
...
Рейтинг: 0 / 0
21.07.2017, 22:28:47
    #39493199
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
SOFT FOR YOU,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  ReportMemoryLeaksOnShutdown := True;
  IsConsole := False;
  try
    Test;
  except

  end;
end.



Так не воспроизводится. Кто освобождать-то будет второй эксепшн?
...
Рейтинг: 0 / 0
21.07.2017, 22:29:42
    #39493200
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
Без try except вокруг вызова Test - воспроизводится, что логично.
...
Рейтинг: 0 / 0
21.07.2017, 22:29:59
    #39493201
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvp...Кто освобождать-то будет второй эксепшн?
?
...
Рейтинг: 0 / 0
21.07.2017, 22:32:45
    #39493202
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
...
Рейтинг: 0 / 0
21.07.2017, 22:43:37
    #39493204
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvpчччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
Ну ты даёшь.
...
Рейтинг: 0 / 0
21.07.2017, 22:44:46
    #39493205
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччДalekcvpчччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
Ну ты даёшь.
Как тогда ты объяснишь, что без try-except там есть утечка, а с ними - нет?
...
Рейтинг: 0 / 0
21.07.2017, 22:49:45
    #39493207
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvpчччДпропущено...

Ну ты даёшь.
Как тогда ты объяснишь, что без try-except там есть утечка, а с ними - нет?

Смотри, утечки нет:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  ReportMemoryLeaksOnShutdown := True;
//  TObject.Create()
  System.Error(reInvalidPtr);
end.



Утечка есть:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  ReportMemoryLeaksOnShutdown := True;
  TObject.Create()
//  System.Error(reInvalidPtr);
end.



Вот:
...
Рейтинг: 0 / 0
21.07.2017, 22:50:47
    #39493208
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvp,

объясняется магией. Магия заключена в слове:

Код: pascal
1.
  raise
...
Рейтинг: 0 / 0
21.07.2017, 22:57:45
    #39493209
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
alekcvp,

извинения: ты, похоже, прав.
У меня на некоторые исключения фильтры стояли.
...
Рейтинг: 0 / 0
21.07.2017, 23:00:33
    #39493211
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
Да, пацаны, спасибо, что разъяснили
Я думал финальный Exception высвобождается
Тему можно закрывать :)
...
Рейтинг: 0 / 0
21.07.2017, 23:01:23
    #39493212
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччДalekcvp,

извинения: ты, похоже, прав.
У меня на некоторые исключения фильтры стояли.
... а также, изначально тест я запускал в шаблонном "vcl - проекте", где есть дефолтный обработчик исключений.
...
Рейтинг: 0 / 0
21.07.2017, 23:05:03
    #39493213
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
чччДСмотри, утечки нет:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;
begin
  ReportMemoryLeaksOnShutdown := True;
//  TObject.Create()
  System.Error(reInvalidPtr);
end.




Смотри, утечка есть:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
program TestPr;

uses
  SysUtils;

begin
  ReportMemoryLeaksOnShutdown := True;
  IsConsole := False;
  raise Exception.Create('Error Message');
end.
...
Рейтинг: 0 / 0
21.07.2017, 23:06:53
    #39493215
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
Не увидел новых сообщений, пока писал :)
...
Рейтинг: 0 / 0
22.07.2017, 07:41:15
    #39493249
Aniskin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
SOFT FOR YOUВ оригинале копируется не текст, а весь эксепшн, с классом и внутренним содержимым

Можно проще сделать:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function Func: Exception;
begin
  Result := nil;
  try
    System.Error(reInvalidPtr);
  except
    on E: Exception do
      begin
        AcquireExceptionObject;
        Result := E;
      end;
  end;
end;
...
Рейтинг: 0 / 0
22.07.2017, 23:55:53
    #39493434
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки при двойном рейзе?
Aniskin,

Спасибо!
Крутая тема
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки при двойном рейзе? / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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