Могу ли я использовать блоки для управления областью переменных в C ++? - PullRequest
5 голосов
/ 24 февраля 2009

Я пытаюсь сэкономить память в программе на C ++ и хочу узнать, могу ли я использовать блоки в качестве области видимости для переменных (как в Perl). Допустим, у меня есть огромный объект, который выполняет некоторые вычисления и дает результат, имеет ли смысл делать:

InputType  input;
ResultType result;

{
    // Block of code
    MyHugeObject mho;
    result = mho.superHeavyProcessing();
}

/*
   My other code ...
*/

Можно ли ожидать, что объект будет уничтожен при выходе из блока?

Ответы [ 4 ]

25 голосов
/ 24 февраля 2009

Да, вы можете.

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

18 голосов
/ 24 февраля 2009

Да, безусловно, и в дополнение к сохранению памяти, вызов деструктора при выходе из области часто используется, когда вы хотите, чтобы деструктор действительно что-то делал, когда вызывается деструктор (см. RAII). Например, чтобы создать блокировку на основе области и легко освободить ее безопасным для исключений способом или детерминистически освободить доступ к общему или ценному ресурсу (например, дескриптору файла / соединению с базой данных).

-Rick

3 голосов
/ 24 февраля 2009

Просто помните, что любая память, которую вы выделяете в куче с помощью new / malloc, которая освобождается в деструкторе, вероятно, не будет возвращена в ОС. Ваш процесс может удержать его, и ОС не вернет его, пока процесс не завершится.

2 голосов
/ 24 февраля 2009

Да. Он будет уничтожен при закрытии фигурной скобки. Но остерегайтесь размещения очень больших объектов в стеке. Это может вызвать переполнение стека. Если ваш объект также выделяет большие объемы памяти, убедитесь, что это куча, выделенная для new, malloc или подобного.

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