user1023395
user1023395

Reputation: 263

Console Application On Termination

What is best method to free up memory when my console application terminates?

I would like to free up any related loaded DLLs and any other resources consumed by my application.

I want to free all things in memory :)

I have searched Google but could not find a way to do this.

I'm not using Units in my application it just console application

program MyAPP;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

/// functions 
// procedures 

begin
end.

Upvotes: 1

Views: 2256

Answers (3)

Warren  P
Warren P

Reputation: 69114

You have not showed what objects you created, but whatever you did to create those objects, the reverse is how you free them, if you wish to.

Note that if your objects are simply consuming memory in the heap, you could just let Windows reclaim all memory used by your process, and the side effects of this (if there are none) might include that your tiny application shuts down faster.

Nevertheless, most conscientious developers choose to fully free every object they create. If you created an object like this:

  x := TMyObject.Create;

.. then you free it by calling Free:

   x.Free;

If the object is a component, owned by its parent, you don't need to free it.

If the object is an interfaced object (reference counted) you simply let go of your reference like this:

   x := nil;

If the type in question is a value-type (Double, Integer) then you don't have to free it.

If the type in question is automatically managed (record, string) you also don't have to free it.

If your object allocates more objects, the correct place to free them is in the destructor of that object.

These are the rules. Just follow them, and you will have no leaks. Your console application terminates in a manner you have not specified. Were you expecting some magic answer to your unspecified question? If it were me, I would ensure my application had an orderly shutdown, and that during normal shutdown, it frees its resources. If it terminates abnormally, then any "try..finally" blocks you have written will not be executed. I recommend you single step through your shutdown code, to see that it executes at all.

If you had posted some examples of your code, then more specific answers would have been possible.

Upvotes: 0

Michał Turecki
Michał Turecki

Reputation: 3197

When your application terminates all memory allocated by it either directly or by Delphi internal allocator (TObject.Create / InitInstance) or by modules is freed by operating system.

Even memory leaks within the application are not an issue after program was terminated. You can check for memory leaks by using FastMM4 library.

Windows should also free it's objects for which you have obtained handles by initialization calls to specialized libraries like GDIPlus yet these should be freed manually after object instance became obsolete in the local scope of the code using them.

For all in-code deallocations you should use try..finally. So your program.dpr might ideally look like:

program YourProgram;
{$APPTYPE CONSOLE}

uses
  MainUnit;

var
  main: TProgramMain
begin
  main := TProgramMain.Create;
  try
    main.Execute;
  finally
    main.Free;
  end;
end.

Upvotes: 0

Andreas Rejbrand
Andreas Rejbrand

Reputation: 109168

begin

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

end.

Upvotes: 7

Related Questions