О размотке стека обычно говорят в связи с обработкой исключений. Вот пример:
void func( int x )
{
char* pleak = new char[1024]; // might be lost => memory leak
std::string s( "hello world" ); // will be properly destructed
if ( x ) throw std::runtime_error( "boom" );
delete [] pleak; // will only get here if x == 0. if x!=0, throw exception
}
int main()
{
try
{
func( 10 );
}
catch ( const std::exception& e )
{
return 1;
}
return 0;
}
Здесь память, выделенная для pleak
, будет потеряна, если возникнет исключение, а память, выделенная для s
, будет должным образом освобождена деструктором std::string
в любом случае. Объекты, расположенные в стеке, «разматываются» при выходе из области действия (здесь область действия функции func
.) Это выполняется компилятором, вставляющим вызовы деструкторов автоматических (стековых) переменных.
Теперь это очень мощная концепция, ведущая к технике, называемой RAII , то есть Получение ресурсов - инициализация , которая помогает нам управлять такими ресурсами, как память соединения с базой данных, дескрипторы открытых файлов и т. д. в C ++.
Теперь это позволяет нам предоставлять исключительные гарантии безопасности .