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
相关产品推荐
相关产品推荐

