← Назад ко всем вопросам

Что произойдет, если у std::vector не хватает памяти для добавления элемента

1️⃣ Как кратко ответить

Если у std::vector не хватает памяти для добавления нового элемента, он автоматически выделяет больше памяти, копирует существующие элементы в новое место и освобождает старую память. Это называется "реаллокацией". Если выделение памяти не удается, выбрасывается исключение std::bad_alloc.

2️⃣ Подробное объяснение темы

std::vector — это динамический массив, который автоматически управляет своей памятью. Когда вы добавляете элементы в std::vector, он может столкнуться с ситуацией, когда текущего объема памяти недостаточно для хранения нового элемента. В таких случаях std::vector выполняет процесс, называемый "реаллокацией".

Как работает реаллокация

  1. Выделение новой памяти: std::vector выделяет больше памяти, чем было изначально. Обычно объем новой памяти в два раза больше текущего, чтобы минимизировать количество будущих реаллокаций.

  2. Копирование элементов: Все существующие элементы копируются из старого места в новое. Это может быть дорогостоящей операцией, особенно если вектор содержит много элементов или если элементы имеют сложные конструкторы копирования.

  3. Освобождение старой памяти: После успешного копирования всех элементов старая память освобождается.

  4. Добавление нового элемента: Новый элемент добавляется в вектор.

Пример кода

#include <iostream>
#include <vector>
#include <stdexcept>
​
int main() {
    std::vector<int> vec;
​
    try {
        // Добавляем элементы в вектор
        for (int i = 0; i < 100; ++i) {
            vec.push_back(i);
            std::cout << "Добавлен элемент: " << i << ", размер вектора: " << vec.size() << ", емкость: " << vec.capacity() << std::endl;
        }
    } catch (const std::bad_alloc& e) {
        std::cerr << "Ошибка выделения памяти: " << e.what() << std::endl;
    }
​
    return 0;
}
  • std::vector<int> vec; — создается пустой вектор для хранения элементов типа int.
  • vec.push_back(i); — добавляет элемент в конец вектора. Если текущей памяти недостаточно, происходит реаллокация.
  • vec.size() — возвращает текущее количество элементов в векторе.
  • vec.capacity() — возвращает количество элементов, которые вектор может хранить без дополнительной реаллокации.
  • std::bad_alloc — исключение, которое выбрасывается, если выделение памяти не удалось.

Зачем это нужно

Реаллокация позволяет std::vector динамически увеличивать свою емкость, обеспечивая гибкость в управлении памятью. Это делает std::vector удобным для использования в ситуациях, когда размер данных заранее неизвестен или может изменяться. Однако частые реаллокации могут быть неэффективными, поэтому важно учитывать это при проектировании программ, особенно если производительность критична.

Тема: STL: Контейнеры
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки