Все ли следующие утверждения верны?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
Как выделяется внутренняя память для Type
одного vector
или любого другого контейнера STL?
Ответы:
выделит
vector
, т.е. информацию заголовка, в стеке, но элементы в свободном хранилище («куча»).распределяет все по бесплатному магазину.
выделит в
vector
стеке и несколько указателей в бесплатном хранилище, но где эти точки определяются тем, как вы их используете (можно указать, например, элемент 0 на свободное хранилище и элемент 1 на стек).источник
vector<Type> vect;
так как элементы на куче и информация заголовка находится в стеке, когда информация заголовка удаляется из памяти, как возвращение функции, что будет происходить с элементами памяти? Они исправлены с информацией заголовка или нет? Если нет, это приведет к утечке памяти?Нет,
vect
будет в стеке, но массив, который он использует для хранения элементов, будет в куче. Элементы будут находиться в этом массиве.Нет. То же, что и выше, за исключением того, что
vector
класс тоже будет в куче.vect
будет в стеке, его элементы (указателиType
) будут в куче, и вы не можете сказать, где будут те,Type
на которые указывают указатели. Может быть в стеке, может быть в куче, может быть в глобальных данных, может быть нигде (т.е.NULL
указатели).Кстати, реализация может фактически хранить некоторые векторы (обычно небольшого размера) в стеке целиком. Не то чтобы я знал о любой такой реализации, но это возможно.
источник
Предполагая реализацию, которая на самом деле имеет стек и кучу (стандарт C ++ не требует таких вещей), единственное верное утверждение - последнее.
Это верно, за исключением последней части (
Type
не будет в стеке). Представить:Точно так же:
True, за исключением последней части, с аналогичным контрпримером:
Для:
это правда, но обратите внимание, что
Type*
указатели будут в куче, ноType
экземпляры, на которые они указывают, не обязательно должны быть:источник
delete
тоже).Только это утверждение верно:
Type*
указатели размещаются в куче, потому что количество указателей может изменяться динамически.vect
в этом случае размещается в стеке, потому что вы определили его как локальную переменную стека.источник
У вектора есть внутренняя часть,
allocator
которая отвечает за распределение / освобождение памятиheap
дляvector element
. Поэтому независимо от того, как вы создаете вектор,element
он всегда располагается наheap
. Что касается метаданных вектора, это зависит от того, как вы их создаете.источник