异常子类初始化后指针失效:为何to_string返回的指针不可用?
问题解析与解决
核心问题出在临时字符串的生命周期和c_str()的指向逻辑上:
to_string(n_)会生成一个临时的std::string对象,这个对象只在当前初始化表达式的执行周期内存在,表达式执行完毕后就会被立即销毁。c_str()返回的是这个临时string内部管理的字符数组指针,一旦临时string被销毁,这块内存就会被系统回收,指针直接变成野指针。
你大概率是把message成员声明成了const char*类型,初始化时直接存储了to_string(n_).c_str()的指针。虽然初始化那一刻指针是有效的,但临时string销毁后,这个指针指向的内存已经完全失效——等调用what()时,访问的是已经被释放的内存,自然输出为空。
解决方法
把BadLengthException里的message成员从const char*改成std::string类型:
class BadLengthException : public std::exception { private: std::string message; // 替换为string类型存储 public: BadLengthException(int n) : message(std::to_string(n)) {} const char* what() const noexcept override { return message.c_str(); // 此时返回的是成员string的有效内存指针 } };
这样初始化时,临时string的内容会被拷贝到成员message里,临时对象销毁后,成员message依然持有有效的字符串数据。调用what()时返回的c_str()指向的是成员string内部的有效内存,就能正常输出内容了。
内容的提问来源于stack exchange,提问作者CcmU
相关产品推荐
相关产品推荐

