Sending an immutable object to a thread
via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Jul 23 02:05:10 PDT 2015
On Wednesday, 22 July 2015 at 17:17:17 UTC, Frank Pagliughi wrote:
> Or, to put it another way, getting threads out of the equation,
> is this safe?
>
> class MyThing { ... }
>
> MyThing* create_a_thing() {
> MyThing mt = new MyThing();
> do_something_with(mt);
> return &mt;
> }
>
> void main() {
> MyThing* pmt = create_a_thing();
> // ...
> }
>
> The "thing" will remain alive for the duration of main() ??
It is not safe, but for a different reason: `mt` is already a
_reference_ to the actual object (that's how classes behave in
D). This reference is located in a register or on the stack, and
`&mt` is therefore a pointer into the stack.
It's illegal to return that pointer from the function, because it
will become invalid once the function is left. Fortunately, the
compiler can detect simple cases like this one, and will refuse
to compile it:
Object* foo() {
Object o;
return &o;
}
xx.d(3): Error: escaping reference to local o
More information about the Digitalmars-d-learn
mailing list