跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. SubForums
  3. 现代C++ | mcpp论坛
  4. 请教如何自定义异常

请教如何自定义异常

已定时 已固定 已锁定 已移动 未解决 现代C++ | mcpp论坛
c++异常处理
2 帖子 2 发布者 25 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • wlly-lzhW 离线
    wlly-lzhW 离线
    wlly-lzh
    编写于 最后由 编辑
    #1

    我是一个会一点C++的菜鸟,我需要在自己的代码里面自定义一个异常类,然后我的代码的写法类似于下面这样:

    #include <exception>
    
    class myException : public std::exception {
    	private:
    		const char * msg;
    	public:
    		myException(const char* message) noexcept : msg(message){}
    		const char * what() const noexcept override{
    			return msg;
    		}
    };
    

    感觉这样写好像不太对,自己看了一下std::exception、std::runtime_error、std::logic_error的代码,发现std::runtime_error和std::logic_error都是用__cow_string这个结构体来存储字符串信息的,代码如下:

    struct __cow_string
      {
        union {
          const char* _M_p;
          char _M_bytes[sizeof(const char*)];
        };
    
        __cow_string();
        __cow_string(const std::string&);
        __cow_string(const char*, size_t);
        __cow_string(const __cow_string&) _GLIBCXX_NOTHROW;
        __cow_string& operator=(const __cow_string&) _GLIBCXX_NOTHROW;
        ~__cow_string();
       __cow_string(__cow_string&&) noexcept;
        __cow_string& operator=(__cow_string&&) noexcept;
    };
    

    貌似只有声明,看不到实现。
    所以到这里来请教一下。

    1 条回复 最后回复
    0
    • ,wlly-lzhW wlly-lzh 将这个主题转为问答主题
    • SPeakS 离线
      SPeakS 离线
      SPeak d2learn-dev mcpp-team
      编写于 最后由 编辑
      #2

      const char * msg; 指针可能会关联到外部对象(不可预期的生命周期), 可以使用 std::string 自己持有对象, 确保生命周期安全. 对关于 __cow_string 这个是 内部实现的 字符串的写时复制 机制, 可以不用管

      可能的风险点

      {
          std::string localVar = "Hi, I'm local var";
          throw myException(localVar.c_str());  // localVar 出作用域 会析构, 可能会导致msg指向无效内存
      }
      
      • https://gcc.gnu.org/onlinedocs/gcc-13.1.0/libstdc++/api/a00605_source.html
      1 条回复 最后回复
      0

      • 登录

      • 没有帐号? 注册

      • 登录或注册以进行搜索。
      d2learn forums Powered by NodeBB
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门
      • Online Tools
      • 用户
      • 群组