On Saturday, 5 January 2019 at 12:14:15 UTC, Russel Winder wrote:
Indeed. I should do that to see if I can reproduce the problem to submit a proper bug report.

File_Ptr is wrapping a dvb_file * from libdvbv5 to try and make things a bit for D and to ensure RAII. libdvbv5 is a C API with classic C approach to handling objects and data structures.

My DStep/with manual binding is at https://github.com/russel/libdvbv5_d and the application using it (which is causing the problems) is at https://github.com/russel/DVBTune

Your problem possibly (probably?) stems from

auto channelsData = TransmitterData(args[1]).scan(frontendId);

The temporary TransmitterData(args[1]) is, well, temporary and its destructor runs after that expression is done. As the returned object from scan references data from the temporary, you have a stale pointer.

I have a feeling that I am really not doing things in a D idiomatic way.

Some driveby style comments then:

        bool opEquals()(const FrontendId other) const {
                if (this is other) return true;
                if (other is null) return false;
return this.adapter_number == other.adapter_number && this.frontend_number == other.frontend_number;
        }

The compiler generated default opEquals will do basically the same thing. Ditto for the other types. You usually want to take a const ref for opEquals since there is no point copying it.

if (other is null)

I'm surprised the compiler doesn't warn or error on that as the only way that could make sense would be if it had an alias this to a pointer type.

You should consider reference counting your pointer wrapper types, FrontendParameters_Ptr/File_Ptr/ScanHandler_Ptr

You seem to like const, good! You don't need to take `const int`s as parameters, you're getting a copy anyway. You have a bunch of redundant casts as well.

I'll have another looks tomorrow when I'm a bit more awake.

Reply via email to