Инициализация массива указателей

171
07 октября 2018, 14:20

Разбираюсь в чужом коде. Насколько правомерно так инициировать:

DataArray<unsigned char> *m_Control[CONTROLINDEX_COUNT] = {0};

Вообще почему не так например:

DataArray<unsigned char> *m_Control[CONTROLINDEX_COUNT] = {0,0,0,0,0,0};

где

#pragma once
/// \brief A class template for a simple array with a fixed size.
template <class T> class DataArray
{
public:
   DataArray(unsigned int size);
   ~DataArray();
   T *data();
   T operator[](unsigned int index);
   unsigned int getSize() const;
protected:
   T *array;          ///< Pointer to the array holding the data
   unsigned int size; ///< Size of the array (Number of variables of type T)
};
/// \brief Initializes the data array.
/// \param size Size of the data array.
template <class T> DataArray<T>::DataArray(unsigned int size)
{
   this->array = new T[size];
   for (unsigned int index = 0; index < size; ++index)
      this->array[index] = 0;
   this->size = size;
}

/// \brief Deletes the allocated data array.
template <class T> DataArray<T>::~DataArray()
{
   delete[] this->array;
}

/// \brief Returns a pointer to the array data.
/// \return The internal data array.
template <class T> T *DataArray<T>::data()
{
   return this->array;
}

/// \brief Returns array element when using square brackets.
/// \return The array element.
template <class T> T DataArray<T>::operator[](unsigned int index)
{
   return this->array[index];
}

/// \brief Gets the size of the array.
/// \return The size of the command in bytes.
template <class T> unsigned int DataArray<T>::getSize() const
{
   return this->size;
}введите сюда код

и

enum ControlIndex {
    CONTROLINDEX_SETOFFSET,
    CONTROLINDEX_SETRELAYS,
    CONTROLINDEX_SETVOLTDIV_CH1,
    CONTROLINDEX_SETVOLTDIV_CH2,
    CONTROLINDEX_SETTIMEDIV,
    CONTROLINDEX_ACQUIIRE_HARD_DATA,
    CONTROLINDEX_COUNT
};
Answer 1

Все совершенно правомерно.

Не совсем ясно, зачем вы поставили на свой вопрос тэг [C], но в языке С инициализатор { 0 } является фактически идиоматическим универсальным нулевым инициализатором, который может использоваться для инициализации нулем/нулями чего угодно.

Ваш второй вариант совершенно не приемлем. Вся идея использования именованной константы CONTROLINDEX_COUNT заключается в том, чтобы абстрагироваться от ее фактического значения, а ваше {0,0,0,0,0,0} достигает прямо противоположного эффекта. Здесь должно быть именно { 0 }, а ни в коем случае не {0,0,0,0,0,0}.

Более того, в С++ коде в данном случае даже уместнее было бы написать

DataArray<unsigned char> *m_Control[CONTROLINDEX_COUNT] = {};

Эффект такого инициализатора в данном случае не отличается от { 0 }, т.е. получается массив нулевых указателей.

P.S. Определение шаблонного класса DataArray тут ни к чему, ибо рассматриваемый массив содержит просто указатели.

READ ALSO
Как зарезервировать память для MapViewOfFileEx?

Как зарезервировать память для MapViewOfFileEx?

Работая с мапингом под виндой, столкнулся с такой проблемой, не получается зарезервировать буфер под MapViewOfFileEx

180
Можно ли динамически определить, как был создан объект - на куче или в стеке?

Можно ли динамически определить, как был создан объект - на куче или в стеке?

Например проверять объект при очищении контейнера:

163
Как правильно создавать Dialog?

Как правильно создавать Dialog?

У меня аварийно завершается программа после того как я открываю диалог повторноПочему так происходить ? Может это быть из-за пустого Деструктор?...

173