什么是堆栈展开?搜索了但找不到有启发性的答案!
堆栈展开通常与异常处理有关。这是一个例子:
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当退出范围时,分配在堆栈上的对象被“展开”(这里的范围是 function func)。这是通过编译器插入对自动(堆栈)变量的析构函数的调用来完成的。
pleak
s
std::string
func
现在这是一个非常强大的概念,导致了称为RAII的技术,即 Resource Acquisition Is Initialization ,它可以帮助我们在 C++ 中管理诸如内存、数据库连接、打开文件描述符等资源。
现在这允许我们提供异常安全保证。