2011-12-23 3 views
0

Я изучаю C++, и я испытываю некоторую путаницу с векторами. В частности, если статический вектор реализует динамический массив внутри, будет ли освобожден стек памяти, используемый указанным динамическим массивом, когда программа закончится или я должен использовать операцию удаления или вызвать деструктор на статическом векторе?Нужно ли удалять статические векторы?

+1

Когда локальная переменная выходит из области видимости, ее деструктор вызывается автоматически. Деструктор 'std :: vector' освободит любую динамическую память, которая была выделена локально локальным объектом' std :: vector' за время своего существования. Деструкторы для глобальных объектов вызываются аналогично до выхода программы. – lapk

+2

Предоставьте пример кода «статический вектор». 'static' означает много вещей в C++. –

ответ

-1

Вся память выпускается на концах программы.

1

Вектор имеет собственное управление внутренней памятью. Это означает, что он выделяет то, что, по его мнению, понадобится во время его создания (в его конструкторе), и любую дополнительную память, которая понадобится ему в случае необходимости.

Когда вектор уничтожается (либо он выходит из сферы действия, либо программа завершается, либо удаляется вручную), вся память, которую она внутренне выделила, удаляется вместе с ней.

0

Деструктор вектора будет вызываться до завершения программы.

Если вектор содержит указатели на объекты, их деструкторы не будут вызываться, хотя на большинстве платформ вся память, выделенная процессом, освобождается, когда программа завершается в любом случае.

3

следует использовать операцию удаления

Если вы не выделяло вещь в вопросе использования new, то никогда вызова delete на нем.

или вызов деструктора на статическом векторе?

Если вы не повторно инициализировать вещь на месте с помощью таргетинга new, то никогда вызова деструктора явно.

(Если вы не тот человек, который реализует зЬй :: вектор для стандартной библиотеки, то вы почти наверняка никогда не должны использовать таргетингом new себя, никогда.)

Глобальные переменные очищаются до автоматически на конце программы.

0

Я не уверен, что вы подразумеваете под действием статического вектора. 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++ является:

То, что вы новый, вы также удалить.

Поскольку вы не использовали новый массив, используемый вектором, вам не нужно его удалять.

+0

'вы также несете ответственность за удаление этих данных.' -> предлагаемое дополнение: и для того, чтобы сделать эту проклятую вещь исключением ...;) –

+0

Хе-хе .. Я должен был заметить, что мой примерный код, который хранит динамически назначенные указатели, НЕ хороший дизайн, просто иллюстрирующий, что если вы храните новую память, класс vector не будет вызывать удаление для них, когда вы вызываете v.clear(). –

Смежные вопросы