You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异常子类初始化后指针失效:为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:45:54