[Issue 10970] Segfault in a simple test compiled without -g.
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Sep 6 07:22:25 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10970
--- Comment #8 from Zhouxuan <pycerl at qq.com> 2013-09-06 07:22:25 PDT ---
(In reply to comment #6)
> (In reply to comment #5)
> > Crashes on win32 as well.
>
> If I recall correctly, I think the problem is "simply" that AA has *very* bad
> support for types with elaborate CC, and destruction. Take this "simple" use
> case:
>
> //####
> import std.stdio;
>
> int count;
>
> struct S
> {
> this(int){++count; writeln("construction");}
> this(this){assert(0);} //never called
> ~this(){--count; writeln("destruction");}
> }
>
> void main()
> {
> S[int] aa;
> writeln("----");
> aa[5] = S(3);
> writeln("----");
> aa.remove(5);
> writeln("----");
> assert(aa.length == 0);
> assert(count >= 0); //Fails here
> }
> //####
> ----
> construction
> destruction
> destruction
> ----
> ----
> //####
>
> In just this little snippet, there are *all* kinds of wrong:
> 1. insertion: when inserting a new item, CC ("this(this)") is never called for
> some strange reason. Furthermore, destruction happens *twice* (again, for some
> strange reason).
> 2. removal: Where's the destructor?
>
> These use cases are probably reported already, you are experiencing the results
> of these defects.
>
> Long story short, at the end of the day, your array is "over-destroyed". Given
> that AA is a *strongly* relies on reference counting to provide deterministic
> behavior, things simply don't go well.
>
> A lot of work is being done on fixing AAs (AFAIK), but don't expect it to be
> fixed any time soon.
>
> As a workaround, you could try using slices instead of AA's?
>
> //----
> import std.stdio;
>
> class A
> {
> this(string name)
> {
> m[name] = Arr.init;
> }
>
> alias A[] Arr;
> Arr[string] m;
> }
>
> int main()
> {
> A a = new A("test");
> return 0;
> }
> //----
>
> In particular, "A" is a class, so it can't have a destructor (in the sense that
> a *reference* doesn't get destroyed). As such, there is minimal use to keeping
> an Array over a slice.
Thank you, I can work around it by changing the design, however, this really
need to be fixed in the near future!
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list