GC being too eager?
Chris
wendlec at tcd.ie
Fri Apr 11 02:32:28 PDT 2014
On Friday, 11 April 2014 at 06:51:01 UTC, Paulo Pinto wrote:
> On Thursday, 10 April 2014 at 09:31:30 UTC, John Colvin wrote:
>> On Thursday, 10 April 2014 at 09:24:51 UTC, Paulo Pinto wrote:
>>> In a toy project I am working on with D v2.065, I came to the
>>> following situation:
>>>
>>> Node path = solver.find (map, start, end);
>>> if (path !is null) {
>>> path.writeContents(); <-- Access Violation
>>> }
>>>
>>> Apparently between the test and trying to use the class, the
>>> reference becomes null.
>>>
>>> Quite strange in a single threaded application.
>>>
>>> Any idea what might be happening or should I delve into
>>> assembly?
>>>
>>> --
>>> Paulo
>>
>> Delve delve delve. Is this in an optimised build?
>
> I found out the cause, apparently std.container.Array destroys
> the memory used by reference types as well (e.g. classes).
>
> The small example below reproduces the error.
>
> Apparently the way Array manages the memory on its own
> invalidates the reference pointed by node, as I assume bad ==
> node, but its memory is invalid.
>
> import std.stdio;
> import std.container;
>
>
> class Node {
> }
>
> Node indentity (Node n)
> {
> return n;
> }
>
> Node badIndentity (Node n)
> {
> Array!Node data;
> data.insert(n);
> return data.front();
> }
>
> int main(string[] args)
> {
> auto node = new Node();
> auto n = indentity (node);
> writefln("Hello the address is %s", n);
> auto bad = badIndentity (node);
> writefln("Hello the address is %s", bad);
>
> return 0;
> }
This reminds me of the question I had about the use of appender.
(http://forum.dlang.org/thread/xfnvtlzyolmtncsmmqqi@forum.dlang.org)
The internal memory management of containers and appender can be
the source of subtle bugs. For cases like your badIndentity
function, Objective-C has autorelease, so it's only released when
the program is done with the value.
Out of interest, why would you write a function like badIndentity
this way? Or is it just a proof of concept?
More information about the Digitalmars-d-learn
mailing list