Удаление переменной стека в C ++ - PullRequest
2 голосов
/ 16 июня 2011

Если в C ++ мы объявляем переменную стека внутри функции, она автоматически удаляется в конце функции или в конце выполнения программы?

Кроме того, является ли ответ на этот вопрос одинаковым для языка C ?

Ответы [ 6 ]

6 голосов
/ 16 июня 2011

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

Обратите внимание, что это не означает в конце функции, если переменная объявлена ​​во внутреннем блоке, как оператор if или цикл.

int main(int argc, char **argv)
{
    int a = 3;

    if (argc > 1)
    {
        int b = 5;
        ++b;
    } // b is destructed here

    // a is destructed here
    // argv and argc are destructed here (or with a)
}

РЕДАКТИРОВАТЬ : Было сделано хорошее замечание о том, что не имеет значения, как выходит область действия. Итак ...

#include <vector>
# include <exception>

int main(int argc, char **argv)
{
    std::vector<int> myVector(10);

    try
    {
        if (argc)
        {
            int a = 10;
            int b = 12;
            for (int c = 0; c < b; c++) // lol
            {
                int c_squared = c*c;
                int theEleventhElement = myVector.at(c);
                // the above will throw std::out_of_range at some point!
            }
        }
    }
    catch (std::out_of_range &ex)
    {
        // do nothing
    }
}

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

  • c_squared
  • c
  • b и a (думаю, в таком порядке, но я не знаю, предусмотрено ли это в стандарте)

На этом этапе, наконец, есть обработчик перехвата с только myVector в области видимости. Этот блок игнорирует исключение, и затем main заканчивается - в ЭТОЙ точке myVector разрушается.

3 голосов
/ 17 июня 2011

В соответствии с 3.7.2 объектами с автоматической продолжительностью хранения последний до выхода из блока, в котором они были созданы . Более подробная информация содержится в 6.6.2 :

При выходе из области ( однако выполнено ) деструкторы (12.4) вызываются для всех построенных объектов с автоматической продолжительностью хранения (3.7.2) (именованные объектыили временные), которые объявлены в этой области, в обратном порядке их объявления.Передача из цикла, из блока или обратно после инициализированной переменной с автоматическим сроком хранения включает уничтожение переменных с автоматическим сроком хранения, которые находятся в области действия в точке, перенесенной из, но не в точке, переданной в.

2 голосов
/ 16 июня 2011

Автоматические переменные автоматически уничтожаются в конце области их охвата.

2 голосов
/ 16 июня 2011

Разрушается, когда выходит за рамки.То же самое для C.

0 голосов
/ 16 июня 2011

Переменная стека - это более или менее пара байтов, сброшенных из стека путем уменьшения указателя стека, она удаляется в конце функции, однако, не просто снова перемещая указатель стека вверх (случай определенные типы) в C ++ из-за дополнительного уничтожения.

В C это простой случай перемещения указателя стека, чтобы избавиться от удерживаемых переменных.

0 голосов
/ 16 июня 2011

Чтобы избежать неоднозначности с оператором new, было бы более уместно сказать, что переменная «выталкивается» при выходе из функции: см. выделение памяти на основе стека . То же самое относится и кC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...