Я не буду -1, но если вы даже можете забыть об этом delete, ваш код неверен.
GManNickG
2
Спустя 8 лет этот комментарий может смутить новичков @GManNickG, как насчет его удаления (поскольку я полагаю, что это было сделано до того, как Джейсон Айверсон фактически удалил массив)?
gsamaras
2
@gsamaras: Согласен, это сбивает с толку, но все же верно: в вашем коде не должно быть ручного удаления, о котором вы должны помнить, чтобы не забыть. То есть использовали умные указатели и другие контейнеры.
GManNickG
1
@GManNickG Я думаю, ваш комментарий может быть менее догматичным. Код правильный, даже если он не идеален. Умные указатели и контейнеры почти всегда являются лучшим вариантом (особенно в таких вопросах для начинающих), но не всегда.
Спенсер
Я согласен с @Spencer, код не ошибочный, он простой, идеальный c ++. Вы можете сказать, что есть альтернатива, называть ее лучшими практиками и т. Д. Но в этом примере как таковом нет ничего плохого.
Арман
67
Начиная с C ++ 11, существует безопасная альтернатива new[]и, в delete[]отличие от std::vector:
std::unique_ptr<int[]> array(newint[size]);
В C ++ 14:
autoarray = std::make_unique<int[]>(size);
Оба вышеизложенного полагаются на один и тот же файл заголовка, #include <memory>
Не знаю, только ли я, но этот синтаксис C ++ 11 выглядит ужасно. C ++ 14 выглядит намного лучше. Опять же, я не успеваю с тех пор, как до C ++ 11. Запоминать все эти новые выражения сложно.
Кея Керстинг,
31
Возможно, вы захотите рассмотреть возможность использования стандартной библиотеки шаблонов. Он прост и удобен в использовании, к тому же вам не нужно беспокоиться о выделении памяти.
int size = 5; // declare the size of the vectorvector<int> myvector(size, 0); // create a vector to hold "size" int's// all initialized to zero
myvector[0] = 1234; // assign values like a c++ array
@Ed, ограничение в вопросе кажется довольно произвольным. std::vectorс соответствующим конструктором работает очень хорошо, и его следует указать в качестве альтернативы. Иногда люди задают вопрос плохо, и это может считаться одним из таких случаев - он очень краткий и не дает никаких оснований для предпочтения new.
Марк Рэнсом,
3
@Ed: Нет причин использовать new[]вместо std::vector.
GManNickG
2
@baash: В C ++ нет причин. Если вы по какой-то причине решите «удалить стандартную библиотеку», вы больше не будете программировать на C ++. Мой комментарий относится к языку C ++, а не к языку C ++, который мы используем на моем устройстве. Даже в этом случае вам не нужно deleteничего делать вручную. Кроме того, std::vectorэто динамический массив, который ничего не делает со связанным списком. Это просто обертка вокруг куска памяти.
GManNickG
1
@Montdidier: Нет. Вы все еще используете newи deleteдля реализации оберток. Дело в том, что вы не управляете ресурсом и не используете его, вы делаете то или другое.
GManNickG
1
@Montdidier: Начнем с утверждений: в C ++ все экземпляры new[]можно заменить на std::vector. И поскольку std::vectorправильно отделяет управление ресурсами от использования ресурсов (SBRM), мы должны это сделать.
@GManNickG Потому что вектор может быть удобнее или по другим причинам? Потому что я часто сталкиваюсь с функциями сторонних разработчиков, которые требуют использования массивов вместо векторов.
Lèse Majesté
5
@ Lèsemajesté Это не причина не использовать векторы - std::vector::data()функция-член вернет базовый необработанный массив, когда это необходимо.
emlai
3
@zenith: Как правило, вы бы использовали operator&вместо того, data()чтобы получать указатель из вектора, но верно, что вектор обеспечивает гарантию непрерывности, необходимую для совместимости с функциями, ожидающими массивы.
Ben Voigt
3
Если речь идет о динамическом массиве, вы можете захотеть не просто создать массив с переменным размером, но и изменить его размер во время выполнения. Вот пример memcpy, вы также можете использовать memcpy_sили std::copy. В зависимости от компилятора <memory.h>или <string.h>может потребоваться. При использовании этой функции вы выделяете новую область памяти, копируете в нее значения исходных областей памяти, а затем освобождаете их.
// create desired array dynamicallysize_t length;
length = 100; //for exampleint *array = newint[length];
// now let's change is's size - e.g. add 50 new elementssize_t added = 50;
int *added_array = newint[added];
/*
somehow set values to given arrays
*/// add elements to arrayint* temp = newint[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;
Вы можете использовать константу 4 вместо sizeof(int).
Вероятно, у вас отсутствует двоеточие или вы не заменили SIZE фактическим размером.
Montdidier
5
Почему должна быть точка с запятой? Это не полное заявление. Может быть еще деклараций. Это, если оно включено в полную программу, делает то, что попросил OP.
Приведенный выше код работает, максимальный размер массива с плавающей запятой или int, который можно было определить, был размером 2095879, а условием выхода было бы ненулевое начальное число ввода
std::vector<int>
. И книгу .Ответы:
int main() { int size; std::cin >> size; int *array = new int[size]; delete [] array; return 0; }
Не забывайте о
delete
каждом массиве, который вы выделяетеnew
.источник
delete
, ваш код неверен.Начиная с C ++ 11, существует безопасная альтернатива
new[]
и, вdelete[]
отличие отstd::vector
:std::unique_ptr<int[]> array(new int[size]);
В C ++ 14:
auto array = std::make_unique<int[]>(size);
Оба вышеизложенного полагаются на один и тот же файл заголовка,
#include <memory>
источник
Возможно, вы захотите рассмотреть возможность использования стандартной библиотеки шаблонов. Он прост и удобен в использовании, к тому же вам не нужно беспокоиться о выделении памяти.
http://www.cplusplus.com/reference/stl/vector/vector/
int size = 5; // declare the size of the vector vector<int> myvector(size, 0); // create a vector to hold "size" int's // all initialized to zero myvector[0] = 1234; // assign values like a c++ array
источник
std::vector
с соответствующим конструктором работает очень хорошо, и его следует указать в качестве альтернативы. Иногда люди задают вопрос плохо, и это может считаться одним из таких случаев - он очень краткий и не дает никаких оснований для предпочтенияnew
.new[]
вместоstd::vector
.delete
ничего делать вручную. Кроме того,std::vector
это динамический массив, который ничего не делает со связанным списком. Это просто обертка вокруг куска памяти.new
иdelete
для реализации оберток. Дело в том, что вы не управляете ресурсом и не используете его, вы делаете то или другое.new[]
можно заменить наstd::vector
. И посколькуstd::vector
правильно отделяет управление ресурсами от использования ресурсов (SBRM), мы должны это сделать.int* array = new int[size];
источник
std::vector::data()
функция-член вернет базовый необработанный массив, когда это необходимо.operator&
вместо того,data()
чтобы получать указатель из вектора, но верно, что вектор обеспечивает гарантию непрерывности, необходимую для совместимости с функциями, ожидающими массивы.Если речь идет о динамическом массиве, вы можете захотеть не просто создать массив с переменным размером, но и изменить его размер во время выполнения. Вот пример
memcpy
, вы также можете использоватьmemcpy_s
илиstd::copy
. В зависимости от компилятора<memory.h>
или<string.h>
может потребоваться. При использовании этой функции вы выделяете новую область памяти, копируете в нее значения исходных областей памяти, а затем освобождаете их.// create desired array dynamically size_t length; length = 100; //for example int *array = new int[length]; // now let's change is's size - e.g. add 50 new elements size_t added = 50; int *added_array = new int[added]; /* somehow set values to given arrays */ // add elements to array int* temp = new int[length + added]; memcpy(temp, array, length * sizeof(int)); memcpy(temp + length, added_array, added * sizeof(int)); delete[] array; array = temp;
Вы можете использовать константу 4 вместо
sizeof(int)
.источник
динамически выделять память, используя
new
:int* array = new int[SIZE];
источник
#include <stdio.h> #include <cstring> #include <iostream> using namespace std; int main() { float arr[2095879]; long k,i; char ch[100]; k=0; do{ cin>>ch; arr[k]=atof(ch); k++; }while(ch[0]=='0'); cout<<"Array output"<<endl; for(i=0;i<k;i++){ cout<<arr[i]<<endl; } return 0; }
Приведенный выше код работает, максимальный размер массива с плавающей запятой или int, который можно было определить, был размером 2095879, а условием выхода было бы ненулевое начальное число ввода
источник