How to free memory allocated via double[][] using dmd-2.0.12?

Markus Dittirich markusle at gmail.com
Tue Apr 8 16:50:37 PDT 2008


Bill Baxter Wrote:

> 
> Markus,  you do not show us what either read_data or process_data do. 
> It is possible that one of those is somehow holding on to references to 
> the data.  This would prevent the GC from collecting the memory.
> 
> Another problem is if you allocate the memory initially as void[] then 
> the GC will scan it for pointers, and in a big float buffer you'll get a 
> lot of false hits.  To prevent that, allocate the buffer initially as 
> byte[] (or double[] --- just not void).
> 
> Anyway, if you want a speedy fix, you'll need to distill this down into 
> something that is actually reproducible by Walter.
> 
> --bb

Hi Bill,

You're of course absolutely correct! Below is a proof of concept code
that still exhibits the issue I was describing. The parse code needs 
to handle row centric ascii data with a variable number of columns.
The file "data_random.dat" contains a single row of random integers.
After a few iterations the code runs out of memory on my machine
and no deleting seems to help.

import std.stream;
import std.stdio;
import std.contracts;
import std.gc;


public double[][] parse(BufferedFile inputFile)
{

  double[][] array;
  foreach(char[] line; inputFile)
  {
    double[] temp;

    foreach(string item; std.string.split(assumeUnique(line)))
    {
       temp ~= std.string.atof(item);
    }

    array ~= temp;
  }

  /* rewind for next round */
  inputFile.seekSet(0);

  return array;
}



int main()
{
  BufferedFile inputFile = new BufferedFile("data_random.dat");

  while(1)
  {
    double[][] foo = parse(inputFile);
  }

  return 1;
}

Thanks much,
Markus



More information about the Digitalmars-d-learn mailing list