Вы немного путаетесь с указателями.
int name1 = 42; // - локальная переменная типа int, хранится на стеке
int* name2; // - локальная переменная типа указатель на int. Сама переменная (! не её значение) хранится на стеке.
int* name3 = &name1; // - аналогично name2, Значение переменной указывает на переменную, которая хранится на стеке
int* name4 = new int(84); // - аналогично name3, Значение переменной указывает на переменную, которая хранится в куче.
Аналогично и с векторами:
vector<int> v1; // - хранит значения переменных
vector<int*> v2; //- хранит указатели на переменные (которые не обязаны вообще быть чем-либо инициализированы, и могут находиться в любом из 4-ех типов типов памяти)
vector<int>* v3; // - указатель на std::vector<int> (может находиться в любом типе памяти).
vector<int*>* v4; // - комбинация v2 и v3.
new vector<int>; Лишь выделяет память в куче и никак не связан с типами переменных. Вот пример
int v5 = *new int(42);
В данном случае будет выделено место в куче, затем (в общем случае) вызван конструктор. Созданная в куче переменная будет хранить 42. Затем мы создаем переменную v5 на стеке и копируем в неё (конструктор копирования в общем случае) значение переменной из кучи. Указатель же на переменную в куче будет потерян aka memory leak.
Вот, кстати, примерчик.
https://godbolt.org/z/eETGh3Whb
Динамически выделить на стеке можно с помощью _malloca(size). Но, в общем, случае делать этого не стоит и это остается уделом тех, кто очень тонко хочет оптимизировать код. std::array принимает одним из параметров шаблона размер, соотвествнно в момент компиляции размер необходимого массива известен и его можно хранить на стеке (по сути это обертка над C-array, удобная и безопастная). Подозреваю, что в случае гиганских размеров std::array есть вероятность, что он может быть расположен в куче (подтверждений и опровержений этому не нашел!).
P.S. Да, многовато вышло.