On 12/15/14 10:24 AM, Steven Schveighoffer wrote:
A guess -- is the class instantiated in C++? if so, it probably is not on the D heap, and probably is not scanned during GC collections. I think your m_samples array is reallocated during a collection, and you are using dangling memory. Try GC.addRoot(this) at the start of the function, and see if it helps.
Ugh... just after saying that, I realized this will not help, because the memory pointed at by 'this' is not GC allocated.
You have to GC.addRoot the m_samples array data, but even when you do that, any time you append it may reallocate, so every time that happens, you must re-add the root.
But you can add the range which includes the m_samples array pointer, and that should solve it (you must do this when m_samples is first allocated, i.e. when it starts pointing at GC memory).
GC.addRange(&m_samples, sizeof(m_samples)); If that doesn't work, try this instead: override bool onProcessSamples(const(short)[] samples) { import std.stdio; import core.memory; auto tmpsamples = m_samples.ptr; for(int i = 0; i<samples.length; ++i) { writeln(m_samples.length); m_samples.length +=1; if(m_samples.ptr !is tmpsamples) // if pointer changed { GC.addRoot(m_samples.ptr); if(tmpsamples) GC.removeRoot(tmpsamples); tmpsamples = m_samples.ptr; } } return true; } -Steve