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

