Destructors¶
A destructor is a special method that allows to perform some actions during struct or class instance destruction. It’s needed in order to free some resources that are belong to the object - deallocate memory, close a file, close a network connection, etc.
A destructor is a method with special name destructor.
It’s possible to avoid specifying of this parameter, in such case implicit this will be created.
A destructor must have only single parameter - this, other parameters are not allowed.
this in a destructor can’t be declared as byval.
It’s not possible to overload destructors.
A destructor is called always when a struct or class instance should be destroyed:
When leaving a scope (for local variables)
When returning from a function (for arguments)
In a destructor of other struct/class (for fields)
During destruction of a temporary variable
In operations with containers
Destructors for local variables in a single scope and for arguments are called in order reverse to creation order. A destructor of a struct or class calls field destructors implicitly.
struct T {}
struct S
{
fn destructor()
{
} // The "t" destructor will be called
T t;
}
fn Foo( S s0 )
{
var S s1;
var S s2;
{
var S s3;
} // A destructor for "s3" will be called
// Destructors for "s2" and "s1" will be called
} // A destructor for "s0" will be called
Destructors generation¶
If a struct or a class has no explicit destructor it will be generated by the compiler automatically. A generated destructor does nothing except calling destructors of fields.
If there is no necessity no destructor should be defined explicitly.
Explicit destructor existence may prevent a struct to be constexpr.