memory management - Do c++ values created in an initialization list go on the stack? -
in other words, following code valid? -- works gcc 4.7, however, not sure in standard or implementation dependent.
struct { int data[3] = { 1, 2, 3 }; }; struct b { b(int data[]) ... struct c : public b { c() : b(a().data) ...
i think question misleading.
struct { int data[3] = { 1, 2, 3 }; }; a new feature of c++11, see [class.mem]: syntax initializes data member data during construction of object of type a. has nothing initializer-lists, it's language feature (list-initialization using braced-init-list).
it's equivalent to:
struct { int data[3]; inline a() : data{1,2,3} {} }; therefore, data on stack if you've created instance of a on stack, , it's on heap if instance has been created on heap.
i guess data initialization resides (= 1,2,3) implementation-defined.
as michael crawford points out, there might issues calling b(int data[]) (which decayed b(int* data)), don't make program ill-formed (it should still compile).
as passing a().data ctor of b:
a() creates temporary object; lifetime specified in [class.temporary]/3
temporary objects destroyed last step in evaluating full-expression (1.9) (lexically) contains point created.
using them in mem-initializer-list no exception; full-expression b::b( a().data ). full-expression includes ctor of b, temporary introduced a() , data member data destroyed after the ctor b::b has been executed.
Comments
Post a Comment