В чем разница между статическим и динамическим размещением вектора в с ++? - PullRequest
0 голосов
/ 24 января 2019

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

case 1: int a[10];

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Следующие два оператора создают 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<> встречается редко, а первый случай не только самый распространенный, но и более безопасный.

0 голосов
/ 24 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...