digitalmars.D.bugs - [Issue 6998] New: std.container.Array destroys class instances
- d-bugmail puremagic.com (29/29) Nov 23 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6998
- d-bugmail puremagic.com (35/35) Jan 21 2012 http://d.puremagic.com/issues/show_bug.cgi?id=6998
http://d.puremagic.com/issues/show_bug.cgi?id=6998
Summary: std.container.Array destroys class instances
Product: D
Version: D2
Platform: x86_64
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: Phobos
AssignedTo: nobody puremagic.com
ReportedBy: mailme+d nilsb.dyndns.org
---
class C {
int i;
}
auto c = new C;
c.i = 42;
Array!C a;
a ~= c;
a.clear;
assert(c.i == 42); // fails
---
Tested with dmd 2.056.
Problem does not arise with structs.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 23 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6998
This happens:
Array!T.Payload's destructor does
---
foreach (ref e; _payload) .clear(e);
---
where .clear is object.clear:
---
void clear(T)(T obj) if (is(T == class))
{
rt_finalize(cast(void*)obj);
}
void clear(T)(ref T obj)
if (!is(T == struct) && !is(T == class) && !_isStaticArray!T)
{
obj = T.init;
}
---
(and other overloads that are not of interest)
That is, when object.clear is given a class instance reference, it destroys the
object, and when given a pointer (e.g. to a 'new'ed struct instance),
it nulls the pointer, but doesn't touch the pointer's target.
So maybe Array shouldn't call object.clear, or it should check for
!is(T == class). Or maybe object.clear shouldn't destroy class instances. To me
this would look more in line with the other versions of object.clear:
---
void clear(T)(ref T obj) if (is(T == class))
{
obj = T.init;
}
---
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 21 2012








d-bugmail puremagic.com