C++异常处理中throw栈解退的过程会释放指针指向的空间吗?

今天看到C++ primer plus p625页中的一句话:“throw语句则处理try块和throw块之间整个函数调用序列(嵌套调用)放在栈中的对象”,那么函数中如果有类似string * ps = new string("hello world");这种代码,那么是仅仅释放ps的空间,还是会加上new出来的空间也一起释放呢?

知识点:

  1. try-catch应该被用类处理异常问题
  2. new/delete应该配对使用,没有配对使用,是一种错误

 

问题:

  1. 如果是栈上变量,抛出异常的时候,变量会被释放,反向调用对应的反初始化(例如析构)。这个处理过程是 Stack unwinding 的过程。
  2. 如果堆上变量,分配的内存在异常点不会被自动释放,这属于错误,不属于异常

 

解决:

  1. 正确理解try-catch解决的问题是什么,区分异常和错误
  2. 一般建议不要在C++里使用异常

 

参考:

  1. https://docs.microsoft.com/en-us/cpp/cpp/exceptions-and-stack-unwinding-in-cpp?view=msvc-160
  2. https://en.cppreference.com/w/cpp/language/throw