[Issue 10970] Segfault in a simple test compiled without -g.
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Sep 6 02:10:50 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10970
monarchdodra at gmail.com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |monarchdodra at gmail.com
--- Comment #6 from monarchdodra at gmail.com 2013-09-06 02:10:45 PDT ---
(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.
--
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