On Saturday, 2 September 2017 at 17:43:08 UTC, Vino.B wrote:
Hi All,

Request your help on how to solve the issue in the below code as when i execute the program with -vgc it state as below:

NewTD.d(21): vgc: using closure causes GC allocation
NewTD.d(25): vgc: array literal may cause GC allocation

void logClean (string[] Lglst, int LogAge) {   //Line 21
        if (!Lglst[0].exists) { mkdir(Lglst[0]); }
        auto ct1 = Clock.currTime();
        auto st1 = ct1 + days(-LogAge);
auto dFiles = dirEntries(Lglst[0], SpanMode.shallow).filter!(a => a.exists && a.isFile && a.timeCreated < st1).map!(a =>[a.name]).array; // Line 25
          dFiles.each!(f => f[0].remove);
}

Line 25 happens because of `[a.name]`. You request a new array: the memory for this has to be allocated (the reason why the compiler says "may" is because sometimes, e.g. if the array literal itself contains only literals, the allocations needn't happen at runtime and no GC call is necessary). Since you don't actually use the array, get rid of it:

---
void logClean (string[] Lglst, int LogAge) {   //Line 21
        if (!Lglst[0].exists) { mkdir(Lglst[0]); }
        auto ct1 = Clock.currTime();
        auto st1 = ct1 + days(-LogAge);
auto dFiles = dirEntries(Lglst[0], SpanMode.shallow).filter!(a => a.exists && a.isFile && a.timeCreated < st1).array; // Line 25
          dFiles.each!(f => f.remove);
}
---

I cannot reproduce the line 21 report, though.
Since you use `timeCreated` I assume you're on Windows, but what's your D compiler, which D frontend version are you using, etc. (all the things needed to attempt to reproduce the error).

Reply via email to