Reply To: Memory leak or not ?

Why OSVVM™? Forums VHDL Memory leak or not ? Reply To: Memory leak or not ?

#2096
Jim Lewis
Member

Memory leak. I do not think the simulators are able to handle this for you.

I should note general VHDL questions like this may get a response faster on StackOverflow, however, I have indeed encountered this one and know a couple of solutions.

The simplest that I have seen, but not used (so it may have flaws) is:

function my_function(obj : t_my_type) return t_my_type is
  type t_my_type_p is access t_my_type; 
  variable return_obj_p : t_my_type_p;  

  -- Function is impure so we can access return_obj_p
  -- and since we cannot pass access types to functions without VHDL-2019
  impure function GetMyTypeValue return t_my_type is
    variable result : t_my_type(return_obj_p'range) ; -- get the constraints (**corrected**)
  begin
    result := return_obj_p.all ;
    deallocate(return_obj_p) ; 
    return result ; 
  end function GetMyTypeValue ;
  
begin
  -- Determine fully constrained dimensions of return object
  ...
  -- Now create the return object
  return_obj_p := new t_my_type(...fully constrained dimensions...);
  -- Initialize contents of return_obj_p
  ...

  return GetMyTypeValue;
end function my_function;

VHDL-2019 allows impure functions to have variable inout parameters and allows passing of the variable return_op_p on the interface, so a function like this could become more general.

VHDL-2019 also introduced sequential block statements to allow local declarative regions, so with that you can do the following.

function my_function(obj : t_my_type) return t_my_type is
  type t_my_type_p is access t_my_type; 
  variable return_obj_p : t_my_type_p;    
begin
  -- Determine fully constrained dimensions of return object
  ...
  -- Now create the return object
  return_obj_p := new t_my_type(...fully constrained dimensions...);
  -- Initialize contents of return_obj_p
  ...

  block  -- VHDL-2019
    variable result : return_obj_p'subtype ; -- get the constraints
  begin
    result := return_obj_p.all ;
    deallocate(return_obj_p) ; 
    return result;
  end block ; 
end function my_function;

Aldec has implemented much of VHDL-2019. For other vendors, be sure to ask them to implement VHDL-2019 in general and specifically this feature. This is not hard stuff, they are just being difficult.

I have used protected types to solve this, the solution is more general than this, but it is also considerably harder to implement.

Cheers,
Jim