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

为何类的clear方法可释放数组内存,析构函数却触发重复释放错误?

内存泄漏与重复释放问题的解决

你的问题核心是clear()函数释放内存后没有重置data指针。当main函数执行完毕,str对象的析构函数会自动调用,此时data仍指向已经被释放的内存区域,再次执行delete [] data就会触发重复释放的错误。

修复方案

  1. 修改clear()函数,重置指针
    在释放内存后,必须将data置为NULL,这样析构函数执行时就不会对无效指针进行操作:

    void String::clear()
    {
        if(data != NULL)
        {
            delete []data;
            data = NULL; // 核心修复:将指针置空
        }
        size = 0;
    }
    
  2. 启用析构函数的内存释放代码
    取消析构函数的注释,让它负责对象销毁时的内存清理:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:50:21