В чем разница между статическим и динамическим размещением вектора в с ++?

Я знаю разницу для следующих случаев:

case 1: int a[10];

для случая 1 память для массива выделяется в стеке.

case 2: int *a = new int[10];

для случая 2 память выделяется в куче и возвращается указатель.

Но в чем разница ниже двух объявлений, так как для векторной памяти всегда выделяется куча

vector<int> v1;
vector<int> *v2 = new vector<int>();

2 ответа

Решение

Следующие два утверждения создают vector<> Однако есть несколько различий между ними.

vector<int> v1;
vector<int> *v2 = new vector<int>();

Прежде всего, фактическое векторное хранилище данных будет выделяться из кучи или любого другого источника, который использует назначенный распределитель памяти (см. Где std::vector выделяет свою память?), И это одинаково для обоих.

Два различия: (1) где vector<> хранятся данные управления и {2} срок службы vector<> и его выделенная память.

В первом случае vector<> Данные управления хранятся в локальной памяти, стеке и когда vector<> переменная выходит из области видимости, вызывается деструктор для устранения пространства хранения векторных данных в куче и пространства управления вектором в стеке. В первом случае, когда vector<> переменная выходит из области видимости, vector<> память правильно освобождена.

Во втором случае оба vector<> пространство для хранения данных и тому vector<> пространство управления находится в куче.

Поэтому, когда указатель переменной, содержащей адрес vector<> выходит за рамки, деструктор для vector<> Сам не называется. Результатом является память, которая не восстанавливается, так как деструктор, который очистит и освободит выделенную память для обеих областей хранения данных vector<> и область управления хранением никогда не вызывается.

Одна возможность для второго случая гарантировать, что vector<> Правильно очищен - это использовать умный указатель, который, когда он выходит из области видимости, также вызовет деструктор для указанной вещи.

В большинстве случаев необходимость во втором случае, используя new создать vector<> редко и первый случай не только самый распространенный, но и более безопасный.

Только std::vector память размещается в куче, остаток (то есть некоторый указатель на хранилище + некоторые дополнительные элементы данных) обычно может быть расположен в стеке, однако путем записи new vector<int>() Вы заставляете все это в кучу.
Обычно нет необходимости выделять векторы таким образом.

Другие вопросы по тегам