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