神厨小福贵! 2022-02-18 16:04 采纳率: 100%
浏览 18
已结题

【C++】为啥会内存泄露

先来看这个类定义:

class String
{
protected:
    struct StrNode
    {
        int ref;  // 引用计数
        int len;  // 字符串的长度
        int size; // 柔性数组的容量
        char data[];
    };
private:
    StrNode* pstr;
}


下面是构造函数:

```c++
String(const char* p = NULL) :pstr(NULL)
    {
        if (p != NULL)
        {
            int sz = strlen(p);
            pstr = (StrNode*)malloc(sizeof(StrNode) + sz * 2 + 1);
            pstr->ref = 1;
            pstr->len = sz;
            pstr->size = sz * 2;
            strcpy(pstr->data, p);
        }
    }
    ~String()    //析构函数
    {
        if (pstr != NULL && --pstr->ref == 0)
        {
            free(pstr);
        }
        pstr = NULL;
    }
    String(const String& str) :pstr(NULL)    //拷贝构造函数
    {
        if (str.pstr != NULL)
        {
            pstr = str.pstr;
            pstr->ref += 1;
        }
    }

主函数调用:  为了实现s1 = s1 + s4这个功能
int main()
{
    String s1("yhping");
    String s2(s1);

    String s3("hello");
    String s4("hahaha");

    s1 = s1 + s4;
}




下面是为了完成s1 = s1 + s4而重写的+函数
String operator+(const String& s) const
    {
        if (pstr == NULL && s.pstr == NULL)
        {
            return String();
        }
        else if (pstr != NULL && s.pstr == NULL)
        {
            return *this;
        }
        else if (pstr == NULL && s.pstr != NULL)
        {
            return s;
        }
        else
        {
            int total = (pstr->len + s.pstr->len) * 2;
            StrNode* newsp = (StrNode*)malloc(sizeof(StrNode) + total + 1);
            strcpy(newsp->data, pstr->data);
            strcat(newsp->data, s.pstr->data);
            newsp->ref = 1;
            newsp->len = pstr->len + s.pstr->len;
            newsp->size = total;
            return String(newsp);


            /*int total = (pstr->len + s.pstr->len) * 2;    //这块代码我写的   老师说会内存泄漏   让我自己去想
            char* sp = (char*)malloc(total + 1);
            strcpy(sp, pstr->data);
            strcat(sp, s.pstr->data);
            return String(sp);*/
        }
    }
  • 写回答

2条回答 默认 最新

  • 於黾 2022-02-18 16:17
    关注

    使用malloc动态分配的内存要主动free才能释放

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 已采纳回答 8月13日
  • 创建了问题 2月18日

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探