Are there any methods like isDestroyed or isDisposed to detect whether some object is destroyed or not?
Dan Olson via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Dec 14 08:05:10 PST 2014
"Marc "Schütz\"" <schuetzm at gmx.net> writes:
> On Saturday, 13 December 2014 at 21:20:43 UTC, Andrey Derzhavin wrote:
>>>
>>> import std.stdio;
>>>
>>> class ObjectAType {
>>> bool ok;
>>> this() {ok = true;}
>>> }
>>>
>>> void main()
>>> {
>>> auto a = new ObjectAType;
>>> assert(a.ok);
>>> destroy(a);
>>> assert(!a.ok); // a has been destroyed.
>>> }
>>>
>>
>> This method of detection of collected objects is what I needed.
>> Thanks to everybody for your advise.
>
> Be careful - the memory could still have been reused. For example:
>
> assert(a.ok);
> destroy(a);
> // ... lots of code, maybe multi-threaded ...
> assert(!a.ok); // can fail
>
> If between `destroy()` and the second `assert()`, the memory of the
> object is collected, a new object (of the same or different type) can
> have been placed there. You will then read an arbitrary piece of data
> from that new object, which may or may not evaluate to `true`.
In this case the object cannot be collected by gc because there is still
a good reference to it (variable 'a'). I agree if delete was used
instead of destroy that is would be unsafe.
--
dano
More information about the Digitalmars-d-learn
mailing list