C++ Динамічне розміщення масивів із прикладом

⚡ Розумний підсумок

C++ Динамічне виділення масивів пояснює, як виділяти, змінювати розмір та видаляти масиви в купі під час виконання. LessОхоплюють створення, видалення[], ініціалізацію, копіювання, зміну розміру та шаблони безпечної пам'яті.

  • 🧠 Розподіл купи: new int[size] створює масиви, розмір яких відомий під час виконання.
  • 🔁 Ініціалізація: new int[size](){} обнуляє пам'ять; дужки встановлюють фіксовані значення.
  • 📏 Зміна розміру: Виділити більший буфер, скопіювати його за допомогою std::copy, а потім видалити старий буфер.
  • 🧹 Видалити належним чином: Завжди викликайте delete[] для масивів; ніколи не просто видаляйте.
  • 📦 Віддати перевагу std::vector: Modern C++ надає перевагу векторному формату для автоматичної зміни розміру та RAII.
  • 🤖 AI Revось: Штучний інтелект-асистент виявляє витоки та пропонує розумні підказки.

C++ Динамічне розміщення масивів

Що таке динамічний масив?

Динамічний масив дуже схожий на звичайний масив, але його розмір можна змінювати під час виконання програми. Елементи DynamArray займають безперервний блок пам'яті.

Після створення масиву його розмір не можна змінити. Однак динамічний масив є іншим. Динамічний масив може розширювати свій розмір навіть після заповнення.

Під час створення масиву йому виділяється заздалегідь визначений обсяг пам'яті. Це не стосується динамічного масиву, оскільки він збільшує розмір пам’яті на певний коефіцієнт, коли є потреба.

Фактори, що впливають на продуктивність динамічних масивів

Початковий розмір масиву та його коефіцієнт зростання визначають його продуктивність. Зверніть увагу на такі моменти:

  1. Якщо масив має невеликий розмір і малий фактор зростання, він буде продовжувати перерозподіл пам'яті частіше. Це знизить продуктивність масиву.
  2. Якщо масив має великий розмір і великий коефіцієнт зростання, він матиме величезну частину невикористаної пам’яті. Через це операції зміни розміру можуть тривати довше. Це знизить продуктивність масиву.

Нове ключове слово

In C++, ми можемо створити динамічний масив за допомогою нового ключового слова. Кількість елементів, які потрібно виділити, вказується в парі квадратних дужок. Назва типу має передувати цьому. Запитану кількість предметів буде виділено.

синтаксис

Ключове слово new має такий синтаксис:

pointer_variable = new data_type;

Змінна_покажчика є назвою змінна вказівника.

data_type має бути дійсним C++ тип даних.

Потім ключове слово повертає покажчик на перший елемент. Після створення динамічного масиву ми можемо видалити його за допомогою ключового слова delete.

Приклад 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;
}

вихід:

Нове ключове слово

Ось скріншот коду:

Нове ключове слово

Code Пояснення:

  1. Включіть файл заголовка iostream у нашу програму, щоб використовувати його Функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Виклик функції main(). Логіку програми слід додати в тіло функції.
  4. Оголошіть дві цілі змінні x і n.
  5. Надрукуйте на консолі текст із пропозицією користувача ввести значення змінної n.
  6. Зчитувати введені користувачем дані з клавіатури та призначати їх змінній n.
  7. Оголошіть масив, який містить n цілих чисел, і призначте його змінній покажчика *arr.
  8. Надрукуйте повідомлення із пропозицією ввести n елементів.
  9. Використовуйте цикл for, щоб створити змінну циклу x для повторення елементів, введених користувачем.
  10. Читання елементів, введених користувачем, і збереження їх у масиві arr.
  11. Кінець корпусу для петлі.
  12. Надрукуйте текст на консолі.
  13. Використовуйте цикл for, щоб створити змінну циклу x для перебору елементів масиву.
  14. Виведіть на консоль значення, що містяться в масиві arr.
  15. Кінець тіла циклу for.
  16. Після успішного завершення програма повинна повернути значення.
  17. Кінець тіла функції main().

ПРИМІТКА. У наведеному вище прикладі користувачеві дозволено вказати будь-який розмір масиву під час виконання. Це означає, що розмір масиву визначається під час виконання.

Ініціалізація динамічно виділених масивів

Ініціалізувати динамічний масив до 0 легко.

Синтаксис:

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

У наведеному вище синтаксисі довжина позначає кількість елементів, які потрібно додати до масиву. Оскільки нам потрібно ініціалізувати масив рівним 0, це поле слід залишити порожнім.

Ми можемо ініціалізувати динамічний масив за допомогою списку ініціалізаторів. Давайте створимо приклад, який демонструє це.

Приклад 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;
}

вихід:

Ініціалізація динамічно виділених масивів

Ось скріншот коду:

Ініціалізація динамічно виділених масивів

Code Пояснення:

  1. Включіть файл заголовка iostream у нашу програму, щоб використовувати її функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Виклик функції main(). Логіку програми слід додати в тіло функції.
  4. Оголошіть цілочисельну змінну з іменем x.
  5. Оголошіть динамічний масив під назвою array за допомогою списку ініціалізаторів. Масив буде містити 5 цілих елементів. Зауважте, що ми не використовували оператор «=» між довжиною масиву та списком ініціалізаторів.
  6. Надрукуйте текст на консолі. Endl - це a C++ ключове слово, що означає кінцевий рядок. Він переміщує курсор до наступного речення.
  7. Використовуйте цикл for для перебору елементів масиву.
  8. Вивести на консоль вміст масиву з назвою array.
  9. Кінець тіла циклу for.
  10. Після успішного завершення програма повинна повернути значення.
  11. Кінець тіла функції main().

Зміна розміру масивів

Довжина динамічного масиву встановлюється протягом часу виділення.

Тим не менш, C++ не має вбудованого механізму зміни розміру масиву після його виділення.

Однак ви можете подолати цю проблему, динамічно виділивши новий масив, скопіювавши елементи, а потім стираючи старий масив.

Зверніть увагу: ця методика схильна до помилок, тому намагайтеся її уникати.

Динамічне видалення масивів

Динамічний масив слід видалити з пам'яті комп'ютера, коли його призначення буде виконано. Інструкція delete може допомогти вам у цьому. Потім звільнений простір пам’яті можна використовувати для зберігання іншого набору даних. Однак, навіть якщо ви не видалите динамічний масив із пам’яті комп’ютера, він буде видалений автоматично після завершення програми.

Примітка:

Для видалення динамічного масиву з пам'яті комп'ютера слід використовувати delete[], а не delete. [] наказує ЦП видалити кілька змінних, а не одну змінну. Використання delete замість delete[] під час роботи з динамічним масивом може призвести до проблем. Прикладами таких проблем є витік пам’яті, пошкодження даних, збої тощо.

Приклад 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;
}

вихід:

Динамічне видалення масивів

Ось скріншот коду:

Динамічне видалення масивів

Code Пояснення:

  1. Включіть файл заголовка iostream у нашу програму, щоб використовувати його функції.
  2. Включіть простір імен std у нашу програму, щоб використовувати його класи без його виклику.
  3. Виклик функції main(). Логіку програми слід додати в тіло функції.
  4. Оголосити дві змінні x і n цілочисельного типу даних.
  5. Надрукуйте текст на консолі. У тексті користувачеві буде запропоновано вказати кількість цифр, які він введе.
  6. Читання введених користувачем даних з клавіатури. Вхідне значення буде присвоєно змінній n.
  7. Оголошення змінної покажчика *arr. Масив arr зарезервує деяку пам’ять для зберігання всього n цілих чисел.
  8. Вивести на консоль повідомлення із проханням ввести n чисел.
  9. Створіть цикл for і змінну циклу x, щоб перебирати числа, введені користувачем.
  10. Читання введених користувачем чисел і збереження їх у масиві arr.
  11. Кінець тіла циклу for.
  12. Надрукуйте текст на консолі.
  13. Використовуйте цикл for і змінну циклу x, щоб перебирати вміст масиву arr.
  14. Виведіть на консоль значення масиву arr.
  15. Кінець тіла циклу for.
  16. Виведіть порожній рядок на консолі.
  17. Звільнити пам'ять масиву обр.
  18. Програма поверне значення після успішного завершення.
  19. Кінець тіла функції main().

Поширені запитання

Розмір статичних масивів під час компіляції на стеку. Розмір динамічних масивів під час виконання на купі.

Інструменти штучного інтелекту виявляють витоки, відсутні delete[] та пропонують заміни unique_ptr або vector.

Так. Copilot рефакторує необроблені new та delete у std::vector або смарт-вказівники.

Виділіть більший буфер, скопіюйте його за допомогою std::copy, видаліть старий буфер або скористайтеся std::vector.

delete[] запускає деструктори та звільняє блок. Просте видалення масивів є невизначеною поведінкою.

Використовуйте його за замовчуванням. Він безпечно керує пам'яттю, підтримує зміну розміру, цикли діапазону та винятки.

Ні. Syncхронізувати розподіл, доступ та видалення за допомогою м'ютексів або атомних змінних.

Використовуйте std::vector або std::unique_ptr щоб уникнути ручного видалення[].

Підсумуйте цей пост за допомогою: