Я не уверен, что вы подразумеваете под статическим вектором. std :: vector - это контейнер STL, который управляет массивом с изменяемыми размерами (см .: http://www.cplusplus.com/reference/stl/vector/). static в глобальном контексте означает локальный файл, так что символ не будет виден вне содержимого модуля компиляции. static в контексте класса в основном трюк с пространством имен для создания глобальной переменной, связанной с типом класса (в отличие от экземпляра класса).
Является ли std :: vector статическим или нет, не имеет ничего общего с его реализацией. Все экземпляры std :: vector выделяют и поддерживают динамически размещенный непрерывный массив T. Деструктор вектора удалит массив T, который он ранее выделил. Вам не нужно ни выделять, ни освобождать эту память, ни даже знать, что это происходит. Если ваш экземпляр std :: vector статический, его деструктор будет вызван после выхода из main (). Если он размещен в стеке, его деструктор будет вызываться, когда он выходит из области видимости. Если вы позвоните
std::vector<T>* p = new std::vector<T>();
вы будете отвечать за звонок
delete p;
до того, как p выйдет из области видимости.
Наконец, если ваш вектор содержит динамически размещенные указатели, вы также будете нести ответственность за их удаление.
// Not exception safe code!
std::vector<int*> v;
v.push_back(new int(4));
v.push_back(new int(5));
std::cout << *v[0] << ", " << *v[1] << std::endl;
for (auto iter = v.begin(); iter != v.end(); ++iter) {
delete *iter;
}
v.clear();
Хорошее эмпирическое правило в C / C ++:
То, что вы новый, вы также удаляете.
Поскольку вы не создали новый массив, используемый вектором, вам не нужно его удалять.