C ++ исключение конвертировать из строки в c_str создает мусорные символы - PullRequest
0 голосов
/ 11 июня 2018

У меня есть код, подобный приведенному ниже:

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 голосов
/ 11 июня 2018

string getMyexceptionStr() { return myexception; } - это возвращает копию myexception во временном string.

const char* what() { return getMyexceptionStr().c_str(); } - это возвращает висячий указатель , потому чтовременный string уничтожается в ;.

Замените getMyexceptionStr(), чтобы вместо него вернуть const string&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...