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