为何类的clear方法可释放数组内存,析构函数却触发重复释放错误?
内存泄漏与重复释放问题的解决
你的问题核心是clear()函数释放内存后没有重置data指针。当main函数执行完毕,str对象的析构函数会自动调用,此时data仍指向已经被释放的内存区域,再次执行delete [] data就会触发重复释放的错误。
修复方案
修改
clear()函数,重置指针
在释放内存后,必须将data置为NULL,这样析构函数执行时就不会对无效指针进行操作:void String::clear() { if(data != NULL) { delete []data; data = NULL; // 核心修复:将指针置空 } size = 0; }启用析构函数的内存释放代码
取消析构函数的注释,让它负责对象销毁时的内存清理:String::~String() { if(data != NULL) delete [] data; }
简化优化
C++标准允许对NULL指针执行delete或delete[],不会触发错误。因此可以去掉冗余的非空判断,让代码更简洁:
- 析构函数简化:
String::~String() { delete [] data; } clear()函数简化:void String::clear() { delete [] data; data = NULL; size = 0; }
这样修改后:
- 调用
clear()时,内存被释放,指针置空,析构函数执行时不会重复释放 - 不调用
clear()时,析构函数会自动释放内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者CuberBoy
相关产品推荐
相关产品推荐

