我有一个如下代码:
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
答案 0 :(得分:4)
string getMyexceptionStr() { return myexception; }
- 这会在临时 myexception
中返回string
的副本。
const char* what() { return getMyexceptionStr().c_str(); }
- 这会返回悬空指针,因为临时string
在;
处被销毁。
更改getMyexceptionStr()
以返回const string&
。