Как инициализировать динамический массив в C++?



Как мне достичь динамического эквивалента этой статической инициализации массива:



char c[2] = {};  // Sets all members to '';




char* c = new char[length]; // how do i amend this? 
634   10  

10 ответов:

char* c = new char[length]();

два варианта:

char *c = new char[length];
std::fill(c, c + length, INITIAL_VALUE);
// just this once, since it's char, you could use memset

или:

std::vector<char> c(length, INITIAL_VALUE);

во втором случае второй параметр по умолчанию уже равен 0, поэтому в вашем случае это не нужно:

std::vector<char> c(length);

[Edit: go vote for Fred's answer,char* c = new char[length]();]

возможно использовать std::fill_n()?

char* c = new char[length];
std::fill_n(c,length,0);

C++ не имеет конкретной функции для этого. Однако, если вы используете std:: vector вместо массива (как вы, вероятно, должны делать), вы можете указать значение для инициализации вектора.

std::vector <char> v( 100, 42 );

создает вектор размера 100 со всеми значениями, инициализированными до 42.

форма массива new-expression принимает только одну форму инициализатора: пустой (). Это, кстати, имеет тот же эффект, что и пустой {} в вашем динамическая инициализация.


вышесказанное относится к языку pre-C++11. Начиная с C++11 можно использовать единый синтаксис инициализации с массивом new-expressions

char* c = new char[length]{};
char* d = new char[length]{ 'a', 'b', 'c' };

вы не можете сделать это в одной строке легко. Вы можете сделать:

char* c = new char[length];
memset(c, 0, length);

или, можно перегрузить оператор new:

void *operator new(size_t size, bool nullify)
{
    void *buf = malloc(size);

    if (!buf) {
             // Handle this
    }

    memset(buf, '', size);

    return buf;
}

тогда вы сможете сделать:

char* c = new(true) char[length];

пока

char* c = new char[length];

будет поддерживать старое поведение. (Обратите внимание, если вы хотите все news, чтобы обнулить то, что они создают, вы можете сделать это, используя то же самое выше, но вынимая bool nullify часть).

отметим, что если вы выберете второй путь, вы должны перегрузить стандартный оператор new (тот, что без bool) и оператор delete тоже. Это потому, что здесь вы используете malloc(), и стандарт говорит, что malloc() + delete операции не определены. Так что вам придется перегружать delete использовать free(), и нормальное новое для использования malloc().

на практике, хотя все реализации используют malloc () / free () сами по себе, поэтому даже если вы этого не сделаете, скорее всего, вы не столкнетесь с какими-либо проблемами (кроме языковых юристов, кричащих на ты)

С c++11 мы могли бы использовать инициализации:

char* c = new char[length]{};

для агрегатного типа, то агрегатной инициализации будет выполняться, что имеет тот же эффект, что и char c[2] = {};.

и неявный комментарий многих плакатов = > не используйте массивы, используйте векторы. Все преимущества массивов без каких-либо недостатков. Плюс вы получаете много других вкусностей

Если вы не знаете STL, прочитайте Josuttis стандартную библиотеку C++ и Meyers effective STL

никаких внутренних средств, АФАИК. Использовать это: memset(c, 0, length);

вы должны инициализировать его "от руки" :

char* c = new char[length];
for(int i = 0;i<length;i++)
    c[i]='';

Comments

    Ничего не найдено.