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

实现Mystring类重载赋值运算符出现double free detected in tcache 2错误

错误含义

free(): double free detected 指程序尝试对同一堆内存地址执行两次释放操作。操作系统的内存分配器检测到重复释放的非法操作,主动发送SIGABRT信号终止程序,对应退出码134。

问题根因

你的赋值运算符实现的是浅拷贝逻辑,存在两个核心问题:

  • 赋值时直接将当前对象的ptr_buffer指针赋值为源对象的指针,导致两个Mystring对象的底层缓冲区指向同一块堆内存。当s1和s2生命周期结束调用析构函数时,会先后释放同一块内存,触发重复释放错误。
  • 若你的ptr_buffer是通过new char[]的方式分配的字符串数组,你当前使用delete ptr_buffer释放属于非法操作,数组释放必须使用delete[]。

额外提示:你的check函数采用值传递Mystring参数,若你没有自定义拷贝构造函数,默认生成的拷贝构造也是浅拷贝逻辑,调用check时生成的临时对象析构也会触发同类内存问题。

修复后的赋值运算符实现
Mystring& Mystring::operator=(const Mystring& orig)
{
    if(this != &orig)
    {
        // 释放原有内存,数组类型必须使用delete[]
        delete[] ptr_buffer;
        len = orig.len;
        buf_size = orig.buf_size;
        // 申请独立的新缓冲区
        ptr_buffer = new char[buf_size];
        // 深拷贝字符串内容,包含结尾的'\0'终止符
        strcpy(ptr_buffer, orig.ptr_buffer);
    }
    return *this;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:27:00