On Thursday, 14 June 2018 at 00:42:25 UTC, James Blachly wrote:
...
I assume the (apparent) lack of parity between ctor and dtor is
because the "default postblit" (which I figured out for a
struct means an empty `this(this)` ctor) is called when a copy
is made. My understanding is that I cannot disable the default
postblit and still act as a range, correct? Should I be
overloading this?
2. Directly related to the above, I need, when the range is
consumed, to free() the underlying library's iterator handle.
Naively, I had the destructor do this, but obviously with
multiple calls to ~this I end up with an error free()'ing a
pointer that is no longer alloc'd. What is the correct way to
handle this situation in D?
Other Range and destructor advice generally (e.g., "You should
totally change your design or approach to X instead") is always
welcomed.
James
I think I have a handle on #1 (copy of the range is made for
consumption which is why dtor is called more often than ctor),
but would still be interested in advice regarding #2 (as well as
general Range and dtor advice).
Here:
https://github.com/blachlylab/dhtslib/blob/master/source/dhtslib/tabix.d#L98 I need to free the library's iterator, but the Range's destructor is the wrong place to do this, otherwise memory is freed more than once.
Is it a better approach to (a) somehow guard the call to
tbx_itr_destroy or (b) create a postblit that creates a new
iterator and pointer? (or (c), None of the above) As above, my
understanding is that disabling the default posblit prohibits
acting as a Range.
Thanks in advance