initialization of array as a member using the initialization list

Discussion in 'C++' started by aaragon, Nov 1, 2008.

  1. aaragon

    aaragon Guest

    Hello everyone,

    Is this valid?

    template <class A>
    struct ClassA {

    typedef A value_type;
    value_type* data_;

    explicit ClassA(size_t n) : data(new value_type[]()) {} // note
    the () after []


    // other stuff
    };


    Here A is any type, including primitive types. I run valgrind on this
    code and it gives me the "Conditional jump or move depends on
    uninitialised value(s)" error. So if it is not valid, why is it? Is
    there a way to default initialize the array in the initialization
    list?

    Thank you all,

    aa
    aaragon, Nov 1, 2008
    #1
    1. Advertising

  2. aaragon

    Salt_Peter Guest

    On Nov 1, 6:57 pm, aaragon <> wrote:
    > Hello everyone,
    >
    > Is this valid?
    >
    > template <class A>
    > struct ClassA {
    >
    >     typedef A value_type;
    >     value_type* data_;


    // if its a pointer, label it as such

    value_type* p_data;

    >
    >     explicit ClassA(size_t n) : data(new value_type[]()) {}    // note
    > the () after []
    >


    // all elements of an array are default constructed.
    // in fact, if a default ctor is not available for
    // that template parameter, you lose

    explicit ClassA(const std::size_t n)
    : p_data(new value_type[n]) { }

    ~ClassA() { delete [] p_data; }

    >     // other stuff
    >
    > };
    >
    > Here A is any type, including primitive types. I run valgrind on this
    > code and it gives me the "Conditional jump or move depends on
    > uninitialised value(s)" error. So if it is not valid, why is it? Is
    > there a way to default initialize the array in the initialization
    > list?
    >
    > Thank you all,
    >
    > aa


    A much better solution is to use a std::vector<>, where elements are
    stored in contiguous memory like an array. Another container that is a
    workhoerse is std::deque<>, elements are not contiguous. Advantages
    imclude that these containers are dynamic / resizeable, allocate and
    deallocate automatically. Blends very nicely with common algorithms
    (random access iterator, begin/end). It has a common interface. Very
    powerfull and a LOT easier to use. Its elements need not have a
    default ctor:

    class E { explicit E(double n) { } };

    std::vector< E > vd(1000, E(99.9));

    On the other hand, if i were to reinvent the wheel, I'ld design a
    fixed array with a const size_t as a template parameter.

    template< class A, const std::size_t Size >
    struct Array
    {
    typedef A value_type;
    // ctors
    Array() : data() {}
    explicit Array(const A& a)
    {
    for(value_type* pv = &data[0]; pv != &data[Size]; ++pv)
    {
    *pv = a;
    }
    }
    // and so on ...
    private:
    value_type data[Size];
    };
    Salt_Peter, Nov 2, 2008
    #2
    1. Advertising

  3. aaragon

    James Kanze Guest

    On Nov 2, 3:13 am, Salt_Peter <> wrote:
    > On Nov 1, 6:57 pm, aaragon <> wrote:
    > > template <class A>
    > > struct ClassA {

    >
    > >     typedef A value_type;
    > >     value_type* data_;


    > // if its a pointer, label it as such


    >       value_type* p_data;


    That's very bad advice. It's already labeled as a pointer;
    that's what the * means. If being a pointer is an essential
    part of its semantics, which you do want to reflect in the name,
    then something like dataPointer can be used, but in my
    experience, this isn't needed that much.

    (The one thing that is sometimes useful is a scope indicator;
    something like myData or m_data to indicate that it is a member
    variable. In theory, if your names are good, it shouldn't be
    necessary either, but in practice, it's sometimes an easy way
    out.)

    --
    James Kanze (GABI Software) email:
    Conseils en informatique orientée objet/
    Beratung in objektorientierter Datenverarbeitung
    9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
    James Kanze, Nov 2, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Wolfram Humann
    Replies:
    15
    Views:
    758
    Howard
    Sep 17, 2003
  2. Replies:
    3
    Views:
    846
    Peter_Julian
    Oct 10, 2005
  3. Replies:
    6
    Views:
    459
    Ron Natalie
    Dec 11, 2005
  4. toton
    Replies:
    5
    Views:
    934
    Victor Bazarov
    Sep 28, 2006
  5. Angus
    Replies:
    1
    Views:
    2,634
Loading...

Share This Page