临时对象解构器抛出异常

时间:2018-03-12 06:06:21

标签: c++ exception memory-management

假设我有以下代码。第一个try-catch的行为符合预期。我得到了一个问候"相反,第二次尝试捕获报告捕获0x501da8(指针)。 在第二种情况下,创建临时字符串流子类。在它的析构函数中(因此在解构base base string之前)我调用底层stringstream的str,并使用它来创建runtime_error。为什么代码在第二种情况下不起作用? (使用-fno-elide-constructors进行编译没有区别)

#include <sstream>
#include <iostream>
#include <stdexcept>

class S:public std::stringstream{
public:   
  ~S(){      
    throw std::runtime_error(str());
  }
};


void f(){
  S a;  
  a<<"hello";
}

void g(){
  S()<<"hello";
}

int main(){
  try{
    f();
  }catch(std::runtime_error& b){
    std::cout<<"caught "<<b.what()<<std::endl;
  }

  try{
    g();
  }catch(std::runtime_error& b){
    std::cout<<"caught "<<b.what()<<std::endl;
  }
}

这些想法如下。创建一个&#34;异常流&#34;其中我&lt;&lt;所有的错误细节,让析构函数抛出(所以我确信我创建流后不会忘记抛出)。像if (failcondition){ S()<<"some error "<<someinfo; }之类的东西有没有办法正确实现这种行为?

0 个答案:

没有答案