Является ли способ приведенный в тексте кода динамическим выделением памяти?Если нет,то почему код работает и почему это не динамическое выделение?

#include <iostream>  
using namespace std;
int main() {
    setlocale(LC_ALL, "RUS");
    int lenarr = 0;//фактическая длина массива
    int chislo ;
    int size = 1;
    int* arr = new int[size];
    for (int i = 0; i < size; i++) {
        cout << "Введите элемент массива: ";
        cin >> chislo;
        if (chislo == 0) {
            break;
        }
        else if (chislo != 0) {
            arr[i] = chislo;//инициализация массива
            lenarr++;// считаем длину массива
            if (size == lenarr) {
                size = size * 2;//увелчиваем длину нашего
динамического массива
                cout << "Новый размер массива = " << size << endl;
            }
        }
    }
    cout << "Массив чисел: ";
    for (int i = 0; i < lenarr; i++) {
        cout << arr[i] << " ";//вывод массива
    }
    delete[] arr;
}

Ответы (2 шт):

Автор решения: NunOfIt
#include <iostream>

void scan(int*& arr, int& len) {
    std::cout << "length: ";
    std::cin >> len;
    
    if (len <= 0)
        throw std::domain_error("Length must be a positive integer!");
    if (arr != nullptr)
        delete[] arr;
    
    arr = new int[len];
    for(int i = 0; i < len; ++i) {
        std::cout << "--> arr[" << i << "] = ";
        std::cin >> arr[i];
    }
}

void print(const int* arr, int len) {
    std::cout << "[" << arr[0];
    for(int i = 1; i < len; ++i)
        std::cout << ", " << arr[i];
    std::cout << "]";
}


int main() {
    int length;
    int* arr = nullptr;
    
    scan(arr, length);
    print(arr, length);
    delete[] arr;
    return 0;
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Держите пример. capacity - вместимость массиваа, size - сколько элементов в массиве занято, array - массив.

Массив увеличивается в два раза, если места не хватает. Выделяется новый массив, данные копируются, стирается старый массив. Это кажется сложным, но проще нельзя, не получается. Удвоение массива нужно чтобы время заполнения массива оставалось минимальным.

delete [] nullptr; - "удалять" нулевой указатель можно. Стандарт специально это разрешает.

#include <cassert>  
#include <iostream>  

using namespace std;

int main() {
    int capacity = 0; // вместимость массива
    int size = 0;     // сколько места в массиве занято (size <= capacity)
    int *array = nullptr;

    int n;
    while (cin >> n) {
        if (size == capacity) {
            const int new_capacity = (capacity == 0) ? 1 : 2 * capacity;
            assert(new_capacity >= capacity);
            int *new_array = new int[new_capacity];
            for (int i = 0; i < size; ++i) {
                new_array[i] = array[i];
            }
            delete [] array;
            array = new_array;
            capacity = new_capacity;
        }
        assert(size < capacity);
        array[size] = n;
        ++size;
    }

    for (int i = 0; i < size; ++i) {
        if (i > 0) {
            cout << ' ';
        }
        cout << array[i];
    }
    cout << '\n';

    delete[] array;
}
→ Ссылка