Nie zrobię -1, ale jeśli możesz nawet zapomnieć o tym delete, twój kod jest zły.
GManNickG
2
8 lat później ten komentarz może zmylić początkujących @GManNickG, a co powiesz na jego usunięcie (skoro przypuszczam, że powstał zanim Jason Iverson faktycznie usunął tablicę)?
gsamaras
2
@gsamaras: Zgadzam się, że to zagmatwane, ale nadal jest poprawne: Twój kod nie powinien mieć ręcznego usuwania, o którym musisz pamiętać, aby nie zapomnieć. Oznacza to, że używane inteligentne wskaźniki i inne pojemniki.
GManNickG
@GManNickG Myślę, że Twój komentarz może być mniej dogmatyczny. Kod jest poprawny, nawet jeśli nie jest idealny. Inteligentne wskaźniki i kontenery są prawie zawsze lepszą opcją (szczególnie w przypadku takich pytań dla początkujących), ale nie „zawsze” zawsze.
Spencer
66
Od C ++ 11 istnieje bezpieczna alternatywa dla new[]i delete[]która jest zerowym narzutem w przeciwieństwie do std::vector:
std::unique_ptr<int[]> array(newint[size]);
W C ++ 14:
autoarray = std::make_unique<int[]>(size);
Oba powyższe opierają się na tym samym pliku nagłówkowym, #include <memory>
Nie wiem, czy to tylko ja, ale ta składnia C ++ 11 wygląda okropnie. C ++ 14 wygląda znacznie lepiej. Z drugiej strony nie nadążyłem od czasów poprzedzających C ++ 11. Trudno jest zapamiętać te wszystkie nowe wyrażenia.
Keya Kersting
29
Możesz rozważyć użycie biblioteki szablonów standardowych. Jest prosty i łatwy w użyciu, a ponadto nie musisz się martwić o alokacje pamięci.
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, ograniczenie w pytaniu wydaje się raczej arbitralne. std::vectorz odpowiednim konstruktorem działa naprawdę dobrze i należy go wskazać jako alternatywę. Czasami ludzie źle zadają pytanie, a to może się liczyć jako jeden z tych przypadków - jest bardzo krótkie i nie daje żadnego uzasadnienia dla preferowania new.
Mark Ransom
3
@Ed: Nie ma powodu, aby używać new[]zamiast std::vector.
GManNickG
2
@baash: W C ++ nigdy nie ma powodu. Jeśli z jakiegoś powodu zdecydujesz się „usunąć bibliotekę standardową”, nie będziesz już programować w C ++. Mój komentarz dotyczy języka C ++, a nie języka C ++ - języka, którego używamy na moim urządzeniu. Mimo to nie powinieneś deleteniczego robić ręcznie, nigdy. Ponadto, std::vectorjest tablicą dynamiczną, a nie robi nic z połączonej listy. To tylko opakowanie wokół kawałka pamięci.
GManNickG
1
@Montdidier: Nie. Nadal używasz newi deleteimplementujesz otoki. Chodzi o to, że nie zarządzasz zasobem i nie używasz go, robisz jedno lub drugie.
@GManNickG Ponieważ wektor może być wygodniejszy lub z innych powodów? Ponieważ często napotykam funkcje innych firm, które wymagają użycia tablic zamiast wektorów.
Lèse majesté
5
@ Lèsemajesté Nie ma powodu, aby nie używać wektorów - std::vector::data()funkcja członkowska zwróci podstawową tablicę surową, gdy będzie to potrzebne.
emlai
3
@zenith: Zwykle używałbyś operator&raczej niż data()pobierania wskaźnika z wektora, ale prawdą jest, że wektor zapewnia gwarancję ciągłości potrzebną do zgodności z funkcjami oczekującymi tablic.
Ben Voigt
3
Gdy tylko pojawi się pytanie o tablicę dynamiczną, możesz chcieć nie tylko utworzyć tablicę o zmiennej wielkości, ale także zmienić jej rozmiar w czasie wykonywania. Oto przykład z memcpy, możesz również użyć memcpy_slub std::copy. W zależności od kompilatora <memory.h>lub <string.h>może być wymagane. Korzystając z tej funkcji, przydzielasz nowy obszar pamięci, kopiujesz do niego wartości oryginalnych regionów pamięci, a następnie zwalniasz je.
// 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;
Prawdopodobnie brakuje ci dwukropka lub nie zastąpiłeś ROZMIAR rzeczywistym rozmiarem.
Montdidier
5
Dlaczego powinien być średnik? To nie jest pełne stwierdzenie. Może być więcej deklaracji. To, jeśli jest zawarte w pełnym programie, spełnia to, o co prosił PO.
Powyższy kod działa, maksymalny rozmiar tablicy typu float lub int, który można zdefiniować, to rozmiar 2095879, a warunek wyjścia byłby różny od zera początkowy numer wejściowy
std::vector<int>
. I książkę .Odpowiedzi:
int main() { int size; std::cin >> size; int *array = new int[size]; delete [] array; return 0; }
Nie zapomnij o
delete
każdej przydzielonej tablicynew
.źródło
delete
, twój kod jest zły.Od C ++ 11 istnieje bezpieczna alternatywa dla
new[]
idelete[]
która jest zerowym narzutem w przeciwieństwie dostd::vector
:std::unique_ptr<int[]> array(new int[size]);
W C ++ 14:
auto array = std::make_unique<int[]>(size);
Oba powyższe opierają się na tym samym pliku nagłówkowym,
#include <memory>
źródło
Możesz rozważyć użycie biblioteki szablonów standardowych. Jest prosty i łatwy w użyciu, a ponadto nie musisz się martwić o alokacje pamięci.
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
źródło
std::vector
z odpowiednim konstruktorem działa naprawdę dobrze i należy go wskazać jako alternatywę. Czasami ludzie źle zadają pytanie, a to może się liczyć jako jeden z tych przypadków - jest bardzo krótkie i nie daje żadnego uzasadnienia dla preferowanianew
.new[]
zamiaststd::vector
.delete
niczego robić ręcznie, nigdy. Ponadto,std::vector
jest tablicą dynamiczną, a nie robi nic z połączonej listy. To tylko opakowanie wokół kawałka pamięci.new
idelete
implementujesz otoki. Chodzi o to, że nie zarządzasz zasobem i nie używasz go, robisz jedno lub drugie.int* array = new int[size];
źródło
std::vector::data()
funkcja członkowska zwróci podstawową tablicę surową, gdy będzie to potrzebne.operator&
raczej niżdata()
pobierania wskaźnika z wektora, ale prawdą jest, że wektor zapewnia gwarancję ciągłości potrzebną do zgodności z funkcjami oczekującymi tablic.Gdy tylko pojawi się pytanie o tablicę dynamiczną, możesz chcieć nie tylko utworzyć tablicę o zmiennej wielkości, ale także zmienić jej rozmiar w czasie wykonywania. Oto przykład z
memcpy
, możesz również użyćmemcpy_s
lubstd::copy
. W zależności od kompilatora<memory.h>
lub<string.h>
może być wymagane. Korzystając z tej funkcji, przydzielasz nowy obszar pamięci, kopiujesz do niego wartości oryginalnych regionów pamięci, a następnie zwalniasz je.// 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;
Możesz użyć stałej 4 zamiast
sizeof(int)
.źródło
dynamicznie przydziel trochę pamięci za pomocą
new
:int* array = new int[SIZE];
źródło
#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; }
Powyższy kod działa, maksymalny rozmiar tablicy typu float lub int, który można zdefiniować, to rozmiar 2095879, a warunek wyjścia byłby różny od zera początkowy numer wejściowy
źródło