Примеры C++, где требуется динамический массив вместо статического массива

Я пытаюсь понять разницу между статическими и динамическими массивами в С++, и я не могу придумать случай, когда статический массив не помог бы.

Я рассматриваю статический массив, который будет объявлен следующим образом:

    int N=10;
    int arr[N];`

Я прочитал здесь, что основное различие между статическим и динамическим массивом заключается в том, что статический массив выделяется во время компиляции, поэтому N необходимо знать при компиляции.

Однако это объясняет, что массивы, объявленные таким образом, также могут быть массивами переменной длины:

Массивы переменной длины были добавлены в C99 — они ведут себя в основном как массивы фиксированной длины, за исключением того, что их размер устанавливается во время выполнения; N не обязательно должно быть константным выражением времени компиляции:`

и действительно, следующий код С++ работает, хотя n известен только во время выполнения:

    int n =-1;
    std::cin>>n;
    int arr[n];

    //Let the user fill the array
    for(int i=0; i<n;i++){
        std::cin>>arr[i];
    }

    //Display array
    for(int i=0; i<n;i++){
        std::cout<<i<<" "<<arr[i]<<std::endl;
    }

Итак, я хотел бы привести пример кода, в котором статические массивы, определенные таким образом, не будут работать, и потребуется использование динамического массива?


person Mai Kar    schedule 04.02.2019    source источник
comment
Ваш код не работает на моем компиляторе (MSVC) именно потому, что VLR не являются частью C++ и, тем не менее, только некоторые компиляторы это позволяют. Другими словами, код, который вы предоставили, является примером, который вы ищете.   -  person Blaze    schedule 04.02.2019
comment
C++ не имеет массивов переменной длины. Некоторые компиляторы допускают его как расширение, но оно не является частью стандарта.   -  person Yksisarvinen    schedule 04.02.2019
comment
Вам нужно включить свои предупреждения. Добавьте -pedantic, если вы используете gcc/clang, и вы обязательно получите сообщение об ошибке.   -  person NathanOliver    schedule 04.02.2019
comment
Не смешивайте статическое распределение с фразами времени компиляции. Статическая переменная имеет время жизни на протяжении всей программы, но массив строится в стеке, если он имеет автоматическое хранение.   -  person Bailey Kocin    schedule 04.02.2019
comment
И, честно говоря, это уже динамический массив. Но в C++ вместо этого мы используем std::array и std::vector.   -  person Matthieu Brucher    schedule 04.02.2019
comment
добавление vlas к C99 не делает их действительными в C++. C и C++ - два разных языка, если это вас смутило.   -  person 463035818_is_not_a_number    schedule 04.02.2019
comment
@NathanOliver Я попробовал ваш совет с довольно новыми компиляторами на godbolt. Прямая демонстрация на godbolt С -pedantic я получил как минимум предупреждение в gcc и clang. (Конечно, с -pedantic-errors это стало ошибкой.) MSCV отклонено с ошибкой (как уже упоминалось @Blaze).   -  person Scheff's Cat    schedule 04.02.2019
comment
@Blaze Хорошо, спасибо, это информация, которую я пропустил, и после прочтения это, я понимаю почему. Если вы поставите это как ответ, я выберу его.   -  person Mai Kar    schedule 04.02.2019
comment
@NathanOliver Я только что проверил команды в онлайн-компиляторе, думаю, это веская причина не делать этого ^^. Если бы я использовал gcc -Wall как обычно, я бы получил это.   -  person Mai Kar    schedule 04.02.2019
comment
Хорошо, я добавил это как ответ. Изначально я этого не делал, потому что уверен, что где-то есть обман, но я попытался добавить немного больше контекста и пару объяснений. Я надеюсь, что все в порядке, и если у кого-то есть больше информации по этому вопросу, не стесняйтесь редактировать его.   -  person Blaze    schedule 04.02.2019


Ответы (1)


Код работает не на всех компиляторах, потому что массивы переменной длины не являются частью C++. Они являются частью C в соответствии с ISO C99, и некоторые компиляторы разрешают VLA в C++, но это не переносимое решение. GCC, например, разрешает VLA, но предупреждает пользователя (-Wno-vla).

Под капотом VLA в любом случае являются динамическими, поскольку компилятор не может зарезервировать соответствующий объем памяти стека, потому что он не знает, насколько большим будет массив. Вместо VLA можно использовать std::vector для динамической памяти, которая освобождается в конце области.

person Blaze    schedule 04.02.2019