Консольное приложение о прекращении - PullRequest
1 голос
/ 13 ноября 2011

Какой лучший способ освободить память при завершении работы моего консольного приложения?

Я хотел бы освободить все связанные загруженные библиотеки DLL и любые другие ресурсы, используемые моим приложением.

Я хочу освободить все вещи в памяти :)

Я искал в Google, но не смог найти способ сделать это.

Я не использую Units в своем приложении, это просто консольное приложение

program MyAPP;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

/// functions 
// procedures 

begin
end.

Ответы [ 3 ]

7 голосов
/ 13 ноября 2011
begin

  try
    // Your entire program goes here.
  finally
    SomeFunction;
  end;

end.
0 голосов
/ 15 ноября 2011

Вы не показали, какие объекты вы создали, но что бы вы ни делали, чтобы создать эти объекты, наоборот, как вы их освобождаете, если хотите.

Обратите внимание, что если ваши объекты просто потребляют память в куче, вы можете просто позволить Windows вернуть всю память, используемую вашим процессом, и побочные эффекты этого (если их нет) могут включать в себя то, что ваше крошечное приложение закрывается быстрее ,

Тем не менее, большинство добросовестных разработчиков предпочитают полностью освобождать каждый объект, который они создают. Если вы создали такой объект:

  x := TMyObject.Create;

.. тогда вы освободите его, позвонив бесплатно:

   x.Free;

Если объект является компонентом, принадлежащим его родителю, вам не нужно его освобождать.

Если объект является интерфейсным объектом (подсчет ссылок), вы просто отпускаете свою ссылку следующим образом:

   x := nil;

Если рассматриваемый тип является типом-значением (Double, Integer), вам не нужно его освобождать.

Если рассматриваемый тип управляется автоматически (запись, строка), вам также не нужно его освобождать.

Если ваш объект выделяет больше объектов, правильное место для их освобождения находится в деструкторе этого объекта.

Это правила. Просто следуйте за ними, и у вас не будет утечек. Ваше консольное приложение завершается способом, который вы не указали. Вы ожидали какого-то волшебного ответа на свой неуказанный вопрос? Если бы это был я, я бы гарантировал, что мое приложение было нормально завершено, и что при нормальном завершении оно освобождает свои ресурсы. Если он завершается ненормально, то все написанные вами блоки try..finally не будут выполнены. Я рекомендую вам один раз пройти через код завершения работы, чтобы убедиться, что он вообще выполняется.

Если бы вы опубликовали несколько примеров своего кода, то были бы возможны более конкретные ответы.

0 голосов
/ 13 ноября 2011

Когда ваше приложение завершает всю память, выделенную им либо напрямую, либо внутренним распределителем Delphi (TObject.Create / InitInstance), либо модулями, освобождается операционной системой.

Даже утечки памяти в приложении не являютсяпроблема после завершения программыВы можете проверить утечки памяти с помощью библиотеки FastMM4.

Windows также должна освободить свои объекты, для которых вы получили дескрипторы, путем инициализации вызовов специализированных библиотек, таких как GDIPlus, но их следует освободить вручную после того, как экземпляр объекта устарел влокальная область кода, использующая их.

Для всех освобождений в коде вы должны использовать try..finally.Так что ваш program.dpr в идеале может выглядеть так:

program YourProgram;
{$APPTYPE CONSOLE}

uses
  MainUnit;

var
  main: TProgramMain
begin
  main := TProgramMain.Create;
  try
    main.Execute;
  finally
    main.Free;
  end;
end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...