c ++异常从字符串转换为c_str会创建垃圾字符

时间:2018-06-11 10:38:56

标签: c++ string exception

我有一个如下代码:

class BaseException : public std::exception {
 private:
  string myexception;

   public:
  BaseException(string str):myexception(str){}
   virtual const char* what() const throw()  { return myexception.c_str();}

  string getMyexceptionStr() { return myexception};
  }

  class CustomException1 : public std::exception {
   public:
  CustomException1(string str):BaseException("CustomException1:"+str){}
   virtual const char* what() const throw()  { return getMyexceptionStr().c_str();}
  }

  class CustomException2 : public std::exception {
   public:
  CustomException2(string str):BaseException("CustomException2:" + str){}
   virtual const char* what() const throw()  { return getMyexceptionStr().c_str();}
  }


    void TestException1(){
    throw CustomException2("Caught in ");
  }

  void TestException2(){
    throw CustomException2("Caught in ");
  }

  int main(){

  try{
  TestException1();
  }
  catch(BaseException &e){
  cout << e.what();
  }

    try{
  TestException2();
  }
  catch(BaseException &e){
  cout << e.what();
  }

  }

每当我运行这个时,我都会得到以下代码

▒g▒▒▒g▒▒Exception1:陷入

▒g▒▒▒g▒▒EException2:陷入

我在同一个类上下文中返回成员变量,范围应该存在,但我仍然会得到垃圾字符。

为了避免垃圾字符,处理它的最佳方法是什么?

由于某些限制,我不能在返回异常时使用malloc或strdup

1 个答案:

答案 0 :(得分:4)

string getMyexceptionStr() { return myexception; } - 这会在临时 myexception中返回string的副本。

const char* what() { return getMyexceptionStr().c_str(); } - 这会返回悬空指针,因为临时string;处被销毁。

更改getMyexceptionStr()以返回const string&