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

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;
}

问题解答

  1. *this = *req的安全性
    从补充的代码来看,这个写法是安全的。你的HttpRequest类成员都是std::string这类具备自动内存管理能力的类型,赋值运算符重载里的直接成员赋值不会导致问题——std::string的赋值运算符会自行处理内存的分配与释放,不会出现野指针或重复释放的情况。同时析构函数为空也合理,因为类中没有裸指针或需要手动管理的资源。

  2. 内存泄漏问题
    这个写法一定会造成内存泄漏。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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:41:06