C++ Dynamická alokace polí s příkladem

⚡ Chytré shrnutí

C++ Dynamická alokace polí vysvětluje, jak alokovat, měnit velikost a mazat pole na haldě za běhu. LessPokrývají nové, delete[], inicializaci, kopírování, změnu velikosti a bezpečné vzory paměti.

  • 🧠 Alokace haldy: new int[size] vytváří pole, jejichž velikost je známa za běhu.
  • 🔁 Inicializace: new int[size](){} nuly v paměti; závorky nastavují pevné hodnoty.
  • 📏 Změna velikosti: Alokovat větší prostor, zkopírovat pomocí std::copy a poté smazat starý buffer.
  • 🧹 Správně smazat: Pro pole vždy volejte delete[]; nikdy ne jen delete.
  • ???? Preferujte std::vector: moderní C++ upřednostňuje vektor pro automatickou změnu velikosti a RAII.
  • 🤖 AI Revpohled: Asistenti s umělou inteligencí detekují úniky a navrhují chytré ukazatele.

C++ Dynamická alokace polí

Co je dynamické pole?

Dynamické pole je velmi podobné běžnému poli, ale jeho velikost je modifikovatelná během běhu programu. Prvky DynamArray zabírají souvislý blok paměti.

Jakmile je pole vytvořeno, nelze jeho velikost změnit. Dynamické pole je však jiné. Dynamické pole může zvětšit svou velikost i poté, co bylo vyplněno.

Během vytváření pole je mu přiděleno předem stanovené množství paměti. To není případ dynamického pole, protože v případě potřeby zvětšuje velikost paměti o určitý faktor.

Faktory ovlivňující výkon dynamických polí

Počáteční velikost pole a jeho růstový faktor určují jeho výkon. Všimněte si následujících bodů:

  1. Pokud má pole malou velikost a malý růstový faktor, bude stále častěji přerozdělovat paměť. Tím se sníží výkon pole.
  2. Pokud má pole velkou velikost a velký růstový faktor, bude mít obrovský kus nevyužité paměti. Z tohoto důvodu mohou operace změny velikosti trvat déle. Tím se sníží výkon pole.

Nové klíčové slovo

In C++, můžeme vytvořit dynamické pole pomocí klíčového slova new. Počet položek, které mají být přiděleny, je uveden v hranatých závorkách. Tomu by měl předcházet název typu. Požadovaný počet položek bude přidělen.

Syntax

Nové klíčové slovo má následující syntaxi:

pointer_variable = new data_type;

Ukazatel_proměnná je název proměnná ukazatele.

Data_type musí být platný C++ datový typ.

Klíčové slovo pak vrátí ukazatel na první položku. Po vytvoření dynamického pole jej můžeme odstranit pomocí klíčového slova delete.

Příklad 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;
}

Výstup:

Nové klíčové slovo

Zde je snímek obrazovky kódu:

Nové klíčové slovo

Code Vysvětlení:

  1. Zahrňte hlavičkový soubor iostream do našeho programu, abyste jej mohli používat funkce.
  2. Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  3. Zavolejte funkci main(). Programová logika by měla být přidána do těla funkce.
  4. Deklarujte dvě celočíselné proměnné x a n.
  5. Vytiskněte na konzoli nějaký text, který uživatele vyzve k zadání hodnoty proměnné n.
  6. Přečtěte si uživatelský vstup z klávesnice a přiřaďte jej proměnné n.
  7. Deklarujte pole tak, aby obsahovalo celkem n celých čísel, a přiřaďte jej proměnné ukazatele *arr.
  8. Vytiskněte zprávu s výzvou k zadání n počtu položek.
  9. Pomocí cyklu for vytvořte proměnnou cyklu x pro iteraci položek zadaných uživatelem.
  10. Přečtěte si prvky zadané uživatelem a uložte je do pole arr.
  11. Konec těla pro smyčku.
  12. Vytiskněte nějaký text na konzoli.
  13. Pomocí cyklu for vytvořte proměnnou cyklu x pro iteraci položek pole.
  14. Vytiskněte hodnoty obsažené v poli s názvem arr na konzole.
  15. Konec těla smyčky for.
  16. Program musí po úspěšném dokončení vrátit hodnotu.
  17. Konec těla funkce main().

POZNÁMKA: Ve výše uvedeném příkladu může uživatel zadat libovolnou velikost pole během běhu. To znamená, že velikost pole je určena během běhu.

Inicializace dynamicky alokovaných polí

Je snadné inicializovat dynamické pole na 0.

Syntaxe:

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

Ve výše uvedené syntaxi délka označuje počet prvků, které mají být přidány do pole. Protože potřebujeme inicializovat pole na 0, toto by mělo zůstat prázdné.

Dynamické pole můžeme inicializovat pomocí seznamu inicializátorů. Vytvořme příklad, který to demonstruje.

Příklad 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;
}

Výstup:

Inicializace dynamicky alokovaných polí

Zde je snímek obrazovky kódu:

Inicializace dynamicky alokovaných polí

Code Vysvětlení:

  1. Chcete-li používat jeho funkce, zahrňte do našeho programu hlavičkový soubor iostream.
  2. Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  3. Zavolejte funkci main(). Programová logika by měla být přidána do těla funkce.
  4. Deklarujte celočíselnou proměnnou s názvem x.
  5. Deklarujte dynamické pole s názvem pole pomocí seznamu inicializátoru. Pole bude obsahovat 5 celočíselných prvků. Všimněte si, že jsme nepoužili operátor „=“ mezi délkou pole a seznamem inicializátoru.
  6. Vytiskněte nějaký text na konzoli. Konec je a C++ klíčové slovo, které znamená koncový řádek. Přesune kurzor na další větu.
  7. K iteraci prvků pole použijte cyklus for.
  8. Vytiskněte obsah pole s názvem pole na konzole.
  9. Konec těla smyčky for.
  10. Program musí po úspěšném dokončení vrátit hodnotu.
  11. Konec těla funkce main().

Změna velikosti polí

Délka dynamického pole se nastavuje během doby přidělení.

Nicméně, C++ nemá vestavěný mechanismus pro změnu velikosti pole, jakmile bylo přiděleno.

Tento problém však můžete překonat dynamickým přidělením nového pole, zkopírováním prvků a následným vymazáním starého pole.

Poznámka: tato technika je náchylná k chybám, proto se jí snažte vyhnout.

Dynamické mazání polí

Dynamické pole by mělo být vymazáno z paměti počítače, jakmile splní svůj účel. K tomu vám může pomoci příkaz delete. Uvolněný paměťový prostor lze poté použít k uložení další sady dat. I když však dynamické pole z paměti počítače neodstraníte, bude po ukončení programu automaticky smazáno.

Poznámka:

Chcete-li odstranit dynamické pole z paměti počítače, měli byste místo delete použít delete[]. [] dává CPU pokyn k odstranění více proměnných místo jedné proměnné. Použití delete namísto delete[] při práci s dynamickým polem může způsobit problémy. Příklady takových problémů zahrnují úniky paměti, poškození dat, selhání atd.

Příklad 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;
}

Výstup:

Dynamické mazání polí

Zde je snímek obrazovky kódu:

Dynamické mazání polí

Code Vysvětlení:

  1. Zahrňte hlavičkový soubor iostream do našeho programu, abyste mohli používat jeho funkce.
  2. Zahrňte do našeho programu jmenný prostor std, abyste mohli používat jeho třídy bez jeho volání.
  3. Zavolejte funkci main(). Programová logika by měla být přidána do těla funkce.
  4. Deklarujte dvě proměnné x a n datového typu integer.
  5. Vytiskněte nějaký text na konzoli. Text vyzve uživatele k uvedení počtu čísel, která zadá.
  6. Čtení uživatelského vstupu z klávesnice. Vstupní hodnota bude přiřazena proměnné n.
  7. Deklarujte proměnnou ukazatele *arr. Pole arr vyhradí část paměti pro uložení celkem n celých čísel.
  8. Vytiskněte na konzole zprávu s výzvou k zadání n čísel.
  9. Vytvořte cyklus for a proměnnou x cyklu pro iteraci čísel zadaných uživatelem.
  10. Přečtěte si čísla zadaná uživatelem a uložte je do pole arr.
  11. Konec těla smyčky for.
  12. Vytiskněte nějaký text na konzoli.
  13. Použijte cyklus for a proměnnou x cyklu k iteraci obsahu pole arr.
  14. Vytiskněte hodnoty pole arr na konzole.
  15. Konec těla smyčky for.
  16. Vytiskněte na konzoli prázdný řádek.
  17. Uvolněte paměť pole arr.
  18. Po úspěšném dokončení program vrátí hodnotu.
  19. Konec těla funkce main().

Nejčastější dotazy

Velikost statických polí na zásobníku při kompilaci. Velikost dynamických polí za běhu na haldě.

Nástroje umělé inteligence detekují úniky, chybějící delete[] a navrhují náhrady unique_ptr nebo vector.

Ano. Copilot refaktoruje nezpracované new a delete do std::vector nebo inteligentních ukazatelů.

Alokujte větší paměť, kopírujte ji pomocí std::copy, smažte starou vyrovnávací paměť pomocí std::vector nebo použijte std::vector.

Funkce delete[] spustí destruktory a uvolní blok. Prosté odstranění polí je nedefinované chování.

Používejte jej jako výchozí. Bezpečně spravuje paměť, podporuje změnu velikosti, smyčky rozsahu a výjimky.

Ne. SyncChronické alokace, přístup a mazání pomocí mutexů nebo atomických objektů.

Použijte std::vector nebo std::unique_ptr aby se zabránilo ručnímu mazání[].

Shrňte tento příspěvek takto: