Порядок уничтожения локальных переменных позволяет вам написать (например) код, подобный следующему:
{
LockSession s(lock);
std::ofstream output("filename");
// write stuff to output
}
LockSession
- это класс, который получает блокировку в своем конструкторе и освобождает еев его деструкторе.
На }
мы знаем, что дескриптор файла будет закрыт (и очищен) до снятия блокировки , что является очень полезной гарантией, еслив программе есть другие потоки, которые используют ту же блокировку для защиты доступа к одному и тому же файлу.
Предположим, что порядок уничтожения не был определен стандартом, тогда нам придется беспокоиться о возможности того, что этот кодснял бы блокировку (позволяя другим потокам получить доступ к файлу), и только потом приступил к очистке и закрытию.Или чтобы сохранить гарантию, в которой мы нуждаемся, мы должны были бы написать код, подобный этому, вместо этого:
{
LockSession s(lock);
{
std::ofstream output("filename");
// write stuff to output
} // closes output
} // releases lock
Этот пример не идеален - очистка файла не гарантированно завершится успешно, поэтому полагайтесьна ofstream
деструкторе это не приведет к пуленепробиваемому коду в этом отношении.Но даже с этой проблемой мы, по крайней мере, гарантируем, что к моменту снятия блокировки у нас больше не будет открытого файла, и в целом это своего рода полезная гарантия, которую может предоставить порядок уничтожения.
Есть и другие гарантии порядка уничтожения в C ++, например, подобъекты базового класса уничтожаются после запуска деструктора производного класса, и что члены данных объекта уничтожаются в обратном порядке построения, также после того, как деструктор производного классазапустить и перед подобъектами базового класса.Здесь есть каждая гарантия, так что вы можете написать код, который каким-то образом полагается на вторую вещь, которая все еще существует, пока первая уничтожена.
Ничто из этого не имеет ничего общего с фактическим перераспределениемпамять, это гораздо больше о том, что делает деструктор.Поскольку вы спрашиваете об отмене выделения, тем не менее, может быть в некоторых случаях, когда некоторые реализации распределителя памяти выигрывают от освобождения блоков в обратном порядке их выделения.Распределителю может быть немного проще уменьшить фрагментацию памяти путем объединения смежных свободных блоков.Однако вам не часто приходится думать об этом, и в любом случае распределители, которым необходимо объединять свободные блоки, должны быть достаточно умны, чтобы делать это в любом порядке, в котором они выделены и освобождены.