Нужно ли удалять статические векторы? - PullRequest
0 голосов
/ 23 декабря 2011

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

Ответы [ 5 ]

3 голосов
/ 23 декабря 2011

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

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

или вызвать деструктор для статического вектора?

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

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

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

1 голос
/ 23 декабря 2011

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

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

0 голосов
/ 23 декабря 2011

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

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

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

0 голосов
/ 23 декабря 2011

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

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

0 голосов
/ 23 декабря 2011

Вся память освобождается в конце программы.

...