Garbage collection from associative arrays
Sebastian Beschke
s.beschke at gmx.de
Sat Mar 25 06:12:29 PST 2006
Well, I found a workaround: Just modify the index type of the
associative array to int.
Sebastian Beschke schrieb:
> The following program creates a couple of instances of a class and
> stores them in an associative array. It then tries to periodically
> access those instances via the associative array, performing garbage
> collects in between.
>
> As it appears, a fullCollect will destroy the objects, even though they
> are stored in an associative array. This leads to an access violation in
> the second loop.
>
> Is this a known bug? Can it be fixed? Are there any workarounds?
>
> Regards, Sebastian
>
>
>
> Output on my machine:
>
> Loading...
> class created
> class created
> class created
> 97
> 98
> 99
> class killed (99)
> class killed (98)
> class killed (97)
> Error: Access Violation
>
>
> Program code:
>
> private {
> import std.gc;
> import std.stdio;
> }
>
>
> class SomeClass {
> this(char value) {
> writefln("class created");
> _value = value;
> }
>
> ~this()
> {
> writefln("class killed (%d)", _value);
> }
>
> char value() {
> return _value;
> }
>
>
> private {
> char _value;
> }
> }
>
> static char[] allChars = [
> 'a', 'b', 'c'
> ];
>
>
> SomeClass[char] _chars;
>
> void _realLoad() {
> writefln("Loading...");
> foreach(char ch; allChars) {
> _chars[ch] = new SomeClass(ch);
> }
> }
>
>
>
> int main(char[][] args)
> {
> bool done = false;
> _realLoad();
>
> while(!done)
> {
> foreach(char ch; allChars) {
> SomeClass obj = _chars[ch];
> writefln("%d", obj.value);
> }
> std.gc.fullCollect();
> }
> }
More information about the Digitalmars-d-bugs
mailing list