C++ Tömbök dinamikus kiosztása példával

⚡ Okos összefoglaló

C++ A tömbök dinamikus kiosztása című rész elmagyarázza, hogyan lehet futásidőben lefoglalni, átméretezni és törölni a tömböket a halomban. LessAz onok lefedik az új, törlés[], inicializálási, másolási, átméretezési és biztonságos memória mintákat.

  • 🧠 Halom kiosztása: Az új int[méret] függvény olyan tömböket hoz létre, amelyek mérete futásidőben ismert.
  • 🔁 inicializálása: Az új int[size](){} nullázza a memóriát; a zárójeles listák fix értékeket állítanak be.
  • 📏 Átméretezés: Foglalj le nagyobbat, másold le az std::copy paranccsal, majd töröld a régi puffert.
  • 🧹 Törlés helyesen: Tömbökön mindig hívd meg a delete[] függvényt; soha ne használd az egyszerű delete függvényt.
  • 📦 Előnyben részesítjük a std::vector-t: Modern C++ az automatikus átméretezéshez és a RAII-hoz a vektort részesíti előnyben.
  • 🤖 AI Revazaz: A mesterséges intelligencia által fejlesztett asszisztensek szivárgásokat észlelnek, és intelligens javaslatokat tesznek.

C++ Tömbök dinamikus elosztása

Mi az a dinamikus tömb?

A dinamikus tömb nagyon hasonlít egy normál tömbhöz, de mérete a program futása során módosítható. A DynamArray elemek egy összefüggő memóriablokkot foglalnak el.

A tömb létrehozása után a mérete nem módosítható. A dinamikus tömb azonban más. A dinamikus tömb méretét még kitöltése után is bővítheti.

Egy tömb létrehozása során előre meghatározott mennyiségű memóriát foglalnak le. Ez nem így van a dinamikus tömbök esetében, mivel szükség esetén egy bizonyos tényezővel növeli a memória méretét.

A dinamikus tömbök teljesítményét befolyásoló tényezők

A tömb kezdeti mérete és növekedési tényezője határozza meg a teljesítményét. Vegye figyelembe a következő pontokat:

  1. Ha egy tömbnek kicsi a mérete és kicsi a növekedési tényezője, akkor gyakrabban fogja újrafoglalni a memóriát. Ez csökkenti a tömb teljesítményét.
  2. Ha egy tömb nagy méretű és nagy növekedési faktorral rendelkezik, akkor hatalmas mennyiségű kihasználatlan memóriája lesz. Emiatt az átméretezési műveletek tovább tarthatnak. Ez csökkenti a tömb teljesítményét.

Az új kulcsszó

In C++, létrehozhatunk egy dinamikus tömböt az új kulcsszó használatával. A kiosztandó elemek száma szögletes zárójelben van megadva. A típusnévnek ezt kell megelőznie. A kért darabszám kiosztásra kerül.

Szintaxis

Az új kulcsszó a következő szintaxist használja:

pointer_variable = new data_type;

A pointer_variable a neve mutató változó.

Az adattípusnak érvényesnek kell lennie C++ adattípus.

A kulcsszó ezután egy mutatót ad vissza az első elemre. A dinamikus tömb létrehozása után a delete kulcsszó segítségével törölhetjük.

Példa 1:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "Enter the number of items:" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " items" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You entered: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	return 0;
}

output:

Az új kulcsszó

Itt van egy képernyőkép a kódról:

Az új kulcsszó

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a programunkba a használatához funkciók.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklaráljunk két x és n egész változót.
  5. Nyomtasson ki néhány szöveget a konzolra, amely felszólítja a felhasználót az n változó értékének megadására.
  6. Olvassa be a felhasználói bevitelt a billentyűzetről, és rendelje hozzá az n változóhoz.
  7. Deklaráljon egy tömböt úgy, hogy összesen n egész számot tartalmazzon, és rendelje hozzá az *arr mutatóváltozóhoz.
  8. Nyomtasson ki egy üzenetet, amelyben felszólítja a felhasználót n számú elem megadására.
  9. Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a felhasználó által beírt elemeket ismételheti.
  10. Olvassa be a felhasználó által beírt elemeket, és tárolja azokat az arr tömbben.
  11. A test vége a hurokhoz.
  12. Nyomtasson szöveget a konzolra.
  13. Használja a for ciklust egy x ciklusváltozó létrehozásához, amely a tömb elemei között ismétlődik.
  14. Nyomtassa ki az arr nevű tömbben található értékeket a konzolon.
  15. A for ciklus törzsének vége.
  16. A programnak értéket kell visszaadnia a sikeres befejezés után.
  17. A main() függvény törzsének vége.

MEGJEGYZÉS: A fenti példában a felhasználó bármilyen méretet megadhat a tömbhöz futás közben. Ez azt jelenti, hogy a tömb méretét a rendszer futás közben határozza meg.

Dinamikusan lefoglalt tömbök inicializálása

Könnyen inicializálható egy dinamikus tömb 0-ra.

Syntax:

int *array{ new int[length]{} };

A fenti szintaxisban a hossz a tömbhöz hozzáadandó elemek számát jelöli. Mivel a tömböt 0-ra kell inicializálnunk, ezt üresen kell hagyni.

Egy dinamikus tömböt inicializálhatunk inicializáló lista segítségével. Hozzunk létre egy példát, amely ezt szemlélteti.

Példa 2:

#include <iostream>
using namespace std;

int main(void) {

	int x; 

	int *array{ new int[5]{ 10, 7, 15, 3, 11 } };

	cout << "Array elements: " << endl;

	for (x = 0; x < 5; x++) {

		cout << array[x] << endl;
	}

	return 0;
}

output:

Dinamikusan lefoglalt tömbök inicializálása

Itt van egy képernyőkép a kódról:

Dinamikusan lefoglalt tömbök inicializálása

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a programunkba a funkcióinak használatához.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklaráljunk egy x nevű egész változót.
  5. Egy tömb nevű dinamikus tömb deklarálása inicializáló lista segítségével. A tömb 5 egész elemet tartalmaz. Vegye figyelembe, hogy nem használtuk az „=” operátort a tömb hossza és az inicializáló lista között.
  6. Nyomtasson szöveget a konzolra. A endl egy C++ kulcsszó, ami a végsort jelenti. A kurzort a következő mondatra viszi.
  7. Használja a for ciklust a tömbelemek ismétléséhez.
  8. Nyomtassa ki a tömb nevű tömb tartalmát a konzolon.
  9. A for ciklus törzsének vége.
  10. A programnak értéket kell visszaadnia a sikeres befejezés után.
  11. A main() függvény törzsének vége.

Tömbök átméretezése

A dinamikus tömb hosszát az allokációs idő alatt állítjuk be.

Azonban, C++ nem rendelkezik beépített mechanizmussal a tömb átméretezésére, miután lefoglalták.

Ezt a kihívást azonban leküzdheti egy új tömb dinamikus kiosztásával, az elemek átmásolásával, majd a régi tömb törlésével.

Megjegyzés: ez a technika hajlamos a hibákra, ezért próbálja meg elkerülni.

Tömbök dinamikus törlése

A dinamikus tömböt törölni kell a számítógép memóriájából, ha elérte a célját. A törlési utasítás segíthet ennek megvalósításában. A felszabaduló memóriaterület ezután újabb adathalmaz tárolására használható. Azonban még ha nem is törli a dinamikus tömböt a számítógép memóriájából, az automatikusan törlődik, amint a program leáll.

Jegyzet:

Ha dinamikus tömböt szeretne törölni a számítógép memóriájából, használja a delete[] parancsot a delete helyett. A [] arra utasítja a CPU-t, hogy egy változó helyett több változót töröljön. A delete [] helyett a delete használata dinamikus tömbök kezelésekor problémákat okozhat. Ilyen problémák például a memóriaszivárgás, az adatsérülés, az összeomlások stb.

Példa 3:

#include<iostream>
using namespace std;
int main() {
	int x, n;
	cout << "How many numbers will you type?" << "\n";
	cin >>n;
	int *arr = new int[n];
	cout << "Enter " << n << " numbers" << endl;
	for (x = 0; x < n; x++) {
		cin >> arr[x];
	}
	cout << "You typed: ";
	for (x = 0; x < n; x++) {
		cout << arr[x] << " ";
	}
	cout << endl;
	delete [] arr;
	return 0;
}

output:

Tömbök dinamikus törlése

Itt van egy képernyőkép a kódról:

Tömbök dinamikus törlése

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a programunkba, hogy használni tudja a funkcióit.
  2. Szerelje be az std névteret a programunkba, hogy az osztályait hívás nélkül használhassa.
  3. Hívja meg a main() függvényt. A program logikáját hozzá kell adni a függvény törzséhez.
  4. Deklarálja az egész adattípus két x és n változóját.
  5. Nyomtasson szöveget a konzolra. A szöveg arra kéri a felhasználót, hogy adja meg a beírandó számok számát.
  6. Felhasználói bevitel olvasása a billentyűzetről. A bemeneti érték az n változóhoz lesz hozzárendelve.
  7. Mutatóváltozó deklarálása *arr. Az arr tömb lefoglal némi memóriát összesen n egész szám tárolására.
  8. Nyomtasson ki egy üzenetet a konzolon, amelyben a felhasználót n szám megadására kéri.
  9. Hozzon létre egy for ciklust és az x ciklusváltozót, hogy a felhasználó által beírt számokon áthaladjon.
  10. Olvassa be a felhasználó által beírt számokat, és tárolja azokat az arr tömbben.
  11. A for ciklus törzsének vége.
  12. Nyomtasson szöveget a konzolra.
  13. Használja a for ciklust és az x ciklusváltozót az arr tömb tartalmának ismétléséhez.
  14. Nyomtassa ki az arr tömb értékeit a konzolon.
  15. A for ciklus törzsének vége.
  16. Nyomtasson egy üres sort a konzolra.
  17. Szabadítsa fel az arr tömb memóriáját.
  18. A program értéket ad vissza, ha sikeresen befejeződik.
  19. A main() függvény törzsének vége.

GYIK

Statikus tömbök mérete fordítási időben a veremben. Dinamikus tömbök mérete futási időben a heapben.

A mesterséges intelligencia eszközei észlelik a szivárgásokat, a hiányzó delete[] elemeket, és unique_ptr vagy vektor cseréket javasolnak.

Igen. A Copilot a nyers new és delete műveleteket std::vector vagy smart pointerekké alakítja.

Foglalj le nagyobbat, másold le az std::copy paranccsal, töröld[] a régi puffert, vagy használd az std::vector paranccsal.

A delete[] függvény destruktorokat futtat és felszabadítja a blokkot. A tömbökön végzett sima törlés nem definiált viselkedés.

Alapértelmezés szerint használja. Biztonságosan kezeli a memóriát, támogatja az átméretezést, a tartományciklusokat és a kivételeket.

Nem. Syncidőzített kiosztás, hozzáférés és törlés mutexekkel vagy atomicokkal.

Használja az std::vector vagy az std::unique_ptr függvényt a kézi törlés elkerülése érdekében[].

Foglald össze ezt a bejegyzést a következőképpen: