Bug 7541 – Postblit not called when returning from an array of structs.

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
Windows
Creation time
2012-02-19T03:20:00Z
Last change time
2012-05-10T19:38:30Z
Assigned to
nobody
Creator
johnaston.dev

Comments

Comment #0 by johnaston.dev — 2012-02-19T03:20:58Z
import std.stdio; struct S { string m_str = "defaultString"; this(this) { writeln("In this(this)"); } ~this() { writeln("In ~this():"~m_str); } } struct Holder { S[] m_arr; S m_s; this(S[] arr) { m_arr = arr; m_s.m_str="H.m_s"; } S getSMem() { return m_s; } S getSVec() { return m_arr[0]; } S getSLocal() { S local = S("localString"); return local; } } void main() { Holder h = Holder(new S[1]); S s1 = h.getSMem(); S s2 = h.getSVec(); S s3 = h.getSLocal(); } The above in Windows D2.058 produces: In this(this) In ~this():localString In ~this():defaultString In ~this():H.m_s In ~this():H.m_s Only one postblit is produced in the above (from the getSMem() call). The getSLocal() call can just move the struct. However, getSVec() does not result in a postblit. I noticed this in the context of a reference counting struct held in a std.container.Array, and there were too few calls to this(this) compared to ~this(). This issue was discussed in: http://stackoverflow.com/questions/9344579/why-is-thisthis-not-called-when-returning-from-array-of-structs
Comment #1 by k.hara.pg — 2012-05-10T19:38:30Z
*** This issue has been marked as a duplicate of issue 7530 ***