January 01, 2017 Re: Unittest hangs on completion | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Zhang | On 12/30/16 9:32 PM, David Zhang wrote: > On Saturday, 31 December 2016 at 02:03:07 UTC, rikki cattermole wrote: >> As it should, current is never reassigned. >> You only need one var, next. Of course I didn't read the entire thread >> chain so, I'm probably missing something. >> >> import std.experimental.allocator; >> >> void main() { >> struct S { S* next; } >> S* _foo; >> foreach (e; 0 .. 10) >> _foo = theAllocator.make!S(_foo); >> S* next; >> >> next = _foo; >> while(next !is null) { >> auto nextT = next.next; >> theAllocator.dispose(next); >> next = nextT; >> } >> } > > Thanks for your response. So next is never null, and thus there is an > infinite loop, correct? This is correct. Rewriting the code as rikki has would be correct code. However, I would also caution about your original code that deallocates inside a destructor. You cannot access nor try to free reference members of a GC-allocated class inside the destructor. It's explicitly cautioned against here: http://dlang.org/spec/class.html#destructors "Furthermore, the order in which the garbage collector calls destructors for unreference objects is not specified. This means that when the garbage collector calls a destructor for an object of a class that has members that are references to garbage collected objects, those references may no longer be valid. This means that destructors cannot reference sub objects." > If so, why does dub indicate that all tests are > complete? Because dub is running the tests and then running your main. Unit tests run before main does. -Steve |
Copyright © 1999-2021 by the D Language Foundation