在这个函数中我需要返回一个char *变量,在我返回它之前,我打印它并打印好。变量发生了什么导致返回变量错误以及为什么?
功能:
const char* NameErrorException::what() const throw()
{
std::string str = "NameErrorException: name \'";
str += _name;
str += "\' is not defimed";
std::cout << str.c_str()<< std::endl; //Prints good
return str.c_str();
}
打印代码:
catch (std::exception& ex)
{
//Prints something like "▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌♀·┘v♦"
std::cout << ex.what() << std::endl;
}
(NameErrorException继承自异常)
谢谢!
答案 0 :(得分:3)
离开函数后,您的字符串uncommenting
将被销毁。因此,返回的指针无效,因为它指向由对象处理的内存。如果对象被破坏,它将再次释放这个内存。
使str
成为异常的成员并在构造函数中初始化它。
比str
将返回有效指针(只要异常对象有效)。
what()
答案 1 :(得分:0)
string::c_str()
返回指向所用内部存储器的指针。
你的string
对象是一个局部变量,它在函数调用结束时被销毁,导致之后的内存访问无效。
你应该将strcpy
用于新生成的内存块,或者直接返回std::string
对象,这将是更安全的选项。