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

HttpRequest与RequestParser赋值运算符循环调用问题求助

解决HttpRequest与RequestParser赋值运算符无限循环问题

问题根源

你的两个类形成了双向赋值依赖:

  • HttpRequest的赋值运算符会调用其RequestParser成员的operator=
  • RequestParser的赋值运算符又会尝试给它持有的HttpRequest引用赋值,触发HttpRequest的operator=
  • 二者往复调用,最终导致栈溢出

另外要注意:RequestParser中持有的HttpRequest引用一旦绑定就无法重新指向其他对象,这也是你在赋值时容易踩坑的核心点。


具体修复方案

方案1:修改RequestParser的赋值逻辑,避免触发HttpRequest赋值

因为引用无法重新绑定,RequestParser的赋值运算符只需要复制自身的非引用成员,不要去操作它持有的HttpRequest引用:

RequestParser& RequestParser::operator=(const RequestParser& other) {
    // 仅复制RequestParser自身的业务成员(比如解析状态、缓冲区等)
    this->parse_state = other.parse_state;
    this->read_buffer = other.read_buffer;
    // 绝对不要执行 this->http_request = other.http_request;
    return *this;
}

方案2:调整HttpRequest的赋值顺序,手动处理RequestParser成员

在HttpRequest的赋值运算符中,先完成自身其他成员的复制,再单独构造/更新RequestParser,确保它绑定到当前HttpRequest对象,而非直接复制原对象的RequestParser(避免引用指向原对象):

HttpRequest& HttpRequest::operator=(const HttpRequest& other) {
    // 1. 先复制HttpRequest自身的核心成员
    this->method = other.method;
    this->request_url = other.request_url;
    this->headers = other.headers;
    this->body = other.body;

    // 2. 手动处理RequestParser成员:构造新实例绑定到当前对象,复制原parser的状态
    this->parser = RequestParser(*this);
    this->parser.set_parse_state(other.parser.get_parse_state());
    this->parser.set_buffer(other.parser.get_buffer());

    return *this;
}

方案3:重构类设计(从根源解决依赖)

双向依赖的设计本身就容易引发这类问题,建议解耦:

  • 让RequestParser不持有HttpRequest引用,而是在解析方法中传入HttpRequest的指针/引用作为参数,例如:
    class RequestParser {
    public:
        bool parse(HttpRequest& req, const char* data, size_t length);
        // ... 其他成员
    };
    
  • 或者将RequestParser的功能内联到HttpRequest中,合并为单一类,彻底消除双向依赖

内容的提问来源于stack exchange,提问作者Jules

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:50:31