Understanding SIGSEGV issues
Nicholas Wilson
iamthewilsonator at hotmail.com
Sat Jan 5 13:14:01 UTC 2019
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.
More information about the Digitalmars-d-learn
mailing list