Я изучаю C++, и я испытываю некоторую путаницу с векторами. В частности, если статический вектор реализует динамический массив внутри, будет ли освобожден стек памяти, используемый указанным динамическим массивом, когда программа закончится или я должен использовать операцию удаления или вызвать деструктор на статическом векторе?Нужно ли удалять статические векторы?
ответ
Вся память выпускается на концах программы.
Вектор имеет собственное управление внутренней памятью. Это означает, что он выделяет то, что, по его мнению, понадобится во время его создания (в его конструкторе), и любую дополнительную память, которая понадобится ему в случае необходимости.
Когда вектор уничтожается (либо он выходит из сферы действия, либо программа завершается, либо удаляется вручную), вся память, которую она внутренне выделила, удаляется вместе с ней.
Деструктор вектора будет вызываться до завершения программы.
Если вектор содержит указатели на объекты, их деструкторы не будут вызываться, хотя на большинстве платформ вся память, выделенная процессом, освобождается, когда программа завершается в любом случае.
следует использовать операцию удаления
Если вы не выделяло вещь в вопросе использования new
, то никогда вызова delete
на нем.
или вызов деструктора на статическом векторе?
Если вы не повторно инициализировать вещь на месте с помощью таргетинга new
, то никогда вызова деструктора явно.
(Если вы не тот человек, который реализует зЬй :: вектор для стандартной библиотеки, то вы почти наверняка никогда не должны использовать таргетингом new
себя, никогда.)
Глобальные переменные очищаются до автоматически на конце программы.
Я не уверен, что вы подразумеваете под действием статического вектора. std :: vector - это контейнер STL, который управляет изменяемым размером массива (см.: http://www.cplusplus.com/reference/stl/vector/). static в глобальном контексте означает, что файл локальный, чтобы символ не был виден вне содержащегося модуля компиляции. static в контексте класса - это, в основном, трюк с именами для создания глобальной переменной, связанной с типом класса (в отличие от экземпляра класса).
Является ли std :: vector статичным или нет, не имеет никакого отношения к тому, как он реализован. Все std :: vector экземпляры выделяют и поддерживают динамически распределенный непрерывный массив дескриптора T. vector, который удалит массив ранее выделенного T. Вам не нужно выделять или освобождать эту память, или даже знать, что это происходит. Если ваш std :: vector экземпляр статичен, его деструктор вызывается после выхода main(). Если он выделен в стеке, его деструктор будет вызываться, когда он выходит за рамки.Если вы звоните
std::vector<T>* p = new std::vector<T>();
вы будете нести ответственность за вызов
delete 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++ является:
То, что вы новый, вы также удалить.
Поскольку вы не использовали новый массив, используемый вектором, вам не нужно его удалять.
'вы также несете ответственность за удаление этих данных.' -> предлагаемое дополнение: и для того, чтобы сделать эту проклятую вещь исключением ...;) –
Хе-хе .. Я должен был заметить, что мой примерный код, который хранит динамически назначенные указатели, НЕ хороший дизайн, просто иллюстрирующий, что если вы храните новую память, класс vector не будет вызывать удаление для них, когда вы вызываете v.clear(). –
- 1. Удалять повторяющиеся записи через векторы
- 2. Нужно ли нам удалять QUpdSockets?
- 3. Нужно ли его удалять? [Qt]
- 4. Нужно ли мне удалять лямбды?
- 5. Нужно ли удалять постоянные файлы cookie?
- 6. Нужно ли мне удалять Xcode при обновлении?
- 7. Нужно ли удалять наблюдателя в NSObject?
- 8. Нужно ли удалять экземпляры StructureMap "per request"?
- 9. Нужно ли удалять элементы, когда массив сжимается?
- 10. F # - Нужно ли удалять ячейки ref явно?
- 11. Собственность QState. Нужно ли удалять все QStates?
- 12. Python - Нужно ли удалять экземпляры из словаря?
- 13. Нужно ли удалять указатель из метода sqlite3_column_blob()?
- 14. Нужно ли удалять ветки из репозитория Git?
- 15. Угловой JS- Нужно ли удалять прослушиватели событий
- 16. Должен ли я удалять локальные указатели, указывающие на статические
- 17. Нужно ли мне удалять статические объекты, которые проживают всю жизнь приложения?
- 18. Зачем нужно * удалять [] и удалять разные?
- 19. Слушателя Firebase нужно всегда удалять?
- 20. удалять статические службы android с поддержкой varialble
- 21. Почему не нужно переносить векторы вручную?
- 22. Нужно ли удалять объекты при сохранении в карте указателей?
- 23. Нужно ли вручную удалять все обработчики событий для каждого экземпляра?
- 24. Нужно ли удалять структуры, маршалированные через Marshal.PtrToStructure в неуправляемом коде?
- 25. OpenCV: Нужно ли нам удалять CvPoint и как это сделать?
- 26. Нужно ли удалять тестовое устройство при публикации на Admob Android?
- 27. Нужно ли удалять ведущие пространства из предложения COBOL pic?
- 28. Нужно ли вручную удалять объект даже после деструктора?
- 29. Drupal 7.17 - Нужно ли удалять эти файлы после установки?
- 30. Нужно ли нам удалять файлы cookie после окончания сеанса?
Когда локальная переменная выходит из области видимости, ее деструктор вызывается автоматически. Деструктор 'std :: vector' освободит любую динамическую память, которая была выделена локально локальным объектом' std :: vector' за время своего существования. Деструкторы для глобальных объектов вызываются аналогично до выхода программы. – lapk
Предоставьте пример кода «статический вектор». 'static' означает много вещей в C++. –