C++中使用*this = *obj是否安全?会引发内存泄漏吗?
关于HttpRequest构造函数中
*this = *req的安全性与内存泄漏问题 我编写了如下HttpRequest类的构造函数:
HttpRequest::HttpRequest(const std::string& request) { HttpRequest* req = HttpRequest::parse(request); // 返回动态分配的对象 if (req == nullptr) { throw HttpException("Invalid request"); } *this = *req; }
请问使用*this = *req是否安全?该写法会不会造成内存泄漏?
更新补充代码
针对疑问,补充赋值运算符重载、析构函数及parse方法的代码:
赋值运算符重载
HttpRequest& HttpRequest::operator=(const HttpRequest& other) { if (this != &other) { this->method = other.method; this->uri = other.uri; // 其他成员赋值... } return *this; }
析构函数
~HttpRequest() { // 空实现(无需要手动释放的资源) }
parse方法
static HttpRequest* parse(const std::string& request) { // 尚未实现,大致逻辑如下: // 解析请求... HttpRequest* req = new HttpRequest(); req->method = "GET"; // 其他成员赋值... return req; }
问题解答
*this = *req的安全性
从补充的代码来看,这个写法是安全的。你的HttpRequest类成员都是std::string这类具备自动内存管理能力的类型,赋值运算符重载里的直接成员赋值不会导致问题——std::string的赋值运算符会自行处理内存的分配与释放,不会出现野指针或重复释放的情况。同时析构函数为空也合理,因为类中没有裸指针或需要手动管理的资源。内存泄漏问题
这个写法一定会造成内存泄漏。parse方法通过new动态分配了HttpRequest对象并返回指针,但构造函数里只完成了*this = *req的赋值操作,没有调用delete req来释放这个动态分配的对象。这块内存会一直被占用直到程序结束,属于典型的内存泄漏场景。
优化建议
解决内存泄漏的核心是正确管理parse返回的动态内存,推荐两种方案:
- 把
parse的返回类型改成std::unique_ptr<HttpRequest>,利用智能指针自动管理内存,构造函数里无需手动释放:static std::unique_ptr<HttpRequest> parse(const std::string& request) { auto req = std::make_unique<HttpRequest>(); req->method = "GET"; // 解析逻辑... return req; } HttpRequest::HttpRequest(const std::string& request) { auto req = HttpRequest::parse(request); if (!req) { throw HttpException("Invalid request"); } *this = *req; } - 重构
parse方法,让它直接返回HttpRequest对象(值返回),彻底避免动态内存分配:static HttpRequest parse(const std::string& request) { HttpRequest req; req.method = "GET"; // 解析逻辑... return req; } HttpRequest::HttpRequest(const std::string& request) : HttpRequest(parse(request)) // 利用拷贝构造函数初始化 {}
内容的提问来源于stack exchange,提问作者Minuta18
相关产品推荐
相关产品推荐

