【摘要】:程序将调用函数的指令地址放到堆栈中。在堆栈中,函数参数被视为自动变量。若被调用的函数创建了新的自动变量,则这些变量也会被填入堆栈中。这一过程称为堆栈解退。函数返回仅仅处理该函数放在堆栈中的对象,而throw语句则处理try块和throw块之间整个函数调用序列中放在堆栈中的所有对象。如果没有堆栈解退的特性,引发异常后对于中间函数调用放在堆栈中的自动类对象,析构函数不会被调用。
假如try块没有直接调用引发异常的函数,而是调用了“调用引发异常的函数”的函数,则程序流程将从引发异常的函数跳转到包含try块和处理程序的函数。这涉及堆栈解退。
C++程序通常是通过函数调用来实现的。C++通过将信息放在堆栈中来处理函数调用。程序将调用函数的指令地址放到堆栈中。被调用函数执行完毕之后,程序将使用该地址来确定从何处开始。函数调用会将函数的参数放到堆栈中。在堆栈中,函数参数被视为自动变量(auto)。若被调用的函数创建了新的自动变量,则这些变量也会被填入堆栈中。如果被调用的函数调用了另一个函数,后者的信息也将被添加至堆栈中,以此类推。当函数结束时,程序流程将转至该函数被调用时的存储地址处,堆栈顶端的元素将被释放。
函数通常都返回到调用它的函数,同时每个函数都在结束时释放其自动变量。若自动变量是类对象,则类的析构函数将被调用。(www.xing528.com)
若函数出现异常而终止,则程序将释放堆栈中的内存,但不会释放堆栈内的第一个返回地址,而是继续释放堆栈,直至寻找到try块中返回的地址。之后,控制权将转到块尾的异常处理程序,而不是函数调用后面的第一条语句。这一过程称为堆栈解退。
引发该机制的一个重要特性是:和函数返回一样,对于堆栈中的自动类对象,类的析构函数将被调用。函数返回仅仅处理该函数放在堆栈中的对象,而throw语句则处理try块和throw块之间整个函数调用序列中放在堆栈中的所有对象。如果没有堆栈解退的特性,引发异常后对于中间函数调用放在堆栈中的自动类对象,析构函数不会被调用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。