powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки при двойном рейзе?
22 сообщений из 22, страница 1 из 1
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493188
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

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

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

В оригинале копируется не текст, а весь эксепшн, с классом и внутренним содержимым
Но это совсем другая история )
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493198
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДSOFT FOR YOU,

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

Также, не подтверждаю утечку на D2007.
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493200
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без try except вокруг вызова Test - воспроизводится, что логично.
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #39493201
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp...Кто освобождать-то будет второй эксепшн?
?
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #39493202
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #39493204
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpчччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
Ну ты даёшь.
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #39493205
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДalekcvpчччД,
Exception'ы (объекты) освобождаются в except-end блоке, если exception остаётся необработанным - возникает утечка памяти, очевидно же?
Ну ты даёшь.
Как тогда ты объяснишь, что без try-except там есть утечка, а с ними - нет?
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493208
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

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

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

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

извинения: ты, похоже, прав.
У меня на некоторые исключения фильтры стояли.
... а также, изначально тест я запускал в шаблонном "vcl - проекте", где есть дефолтный обработчик исключений.
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493215
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не увидел новых сообщений, пока писал :)
...
Рейтинг: 0 / 0
Утечки при двойном рейзе?
    #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
Утечки при двойном рейзе?
    #39493434
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin,

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


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