Something wrong with GC

stunaep via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Mar 22 06:46:41 PDT 2016


On Monday, 21 March 2016 at 07:55:39 UTC, thedeemon wrote:
> On Sunday, 20 March 2016 at 07:49:17 UTC, stunaep wrote:
>> The gc throws invalid memory errors if I use Arrays from 
>> std.container.
>
> Those arrays are for RAII-style deterministic memory release, 
> they shouldn't be freely mixed with GC-allocated things. What 
> happens here is while initializing Array sees it got some GC-ed 
> value type (strings), so it tells GC to look after those 
> strings. When your program ends runtime does a GC cycle, finds 
> your Test object, calls its destructor that calls Array 
> destructor that tries to tell GC not to look at its data 
> anymore. But during a GC cycle it's currently illegal to call 
> such GC methods, so it throws an error.
> Moral of this story: try not to store "managed" (collected by 
> GC) types in Array and/or try not to have Arrays inside 
> "managed" objects. If Test was a struct instead of a class, it 
> would work fine.

So what am I do to? Any other language can do such a thing so 
trivially... I also run into the same problem with 
emsi_containers TreeMap. It is imperative that I can store data 
such as

> public class Example1 {
>	
>	private File file;
>	
>	public this(File f) {
>		this.file = f;	
>	}
> }

or

> public class Example2 {
>	
>	private int one;
>	private int two;
>	
>	public this(int one, int two) {
>		this.one = one;
>		this.two = two;
>	}
> }

in a tree map and list of some sort. Neither of the above work 
whether they are classes or structs and it's starting to become 
quite bothersome...



More information about the Digitalmars-d-learn mailing list