В чем разница между статическим и динамическим размещением вектора в с ++?
Я знаю разницу для следующих случаев:
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>()
Вы заставляете все это в кучу.
Обычно нет необходимости выделять векторы таким образом.