【C++】模拟STL容器,浅拷贝和内存泄漏

用类模拟一个容器

using namespace std;
# define SEQ_INIT_SIZE 200 
class Seqlist
{
    int* data;//指向堆空间
    int maxsize;//总大小
    int cursize; //当前对象个数
public:
    //构造函数
    Seqlist() :data(NULL), maxsize(SEQ_INIT_SIZE), cursize(0)
    {
        data = (int*)malloc(sizeof(int));
    }
    //拷贝构造函数
    Seqlist(const Seqlist& s)
    {
        data = s.data;
        maxsize = s.maxsize;
        cursize = s.cursize;
    }
    ~Seqlist()
    {
        free(data);
        data = NULL;
    }
    Seqlist& operator=(const Seqlist& s)
    {
        if (this != &s)
        {
            data = s.data;
            maxsize = s.maxsize;
            cursize = s.cursize;
        }
        return *this;
    }
    
};

重复析构:

int main()
{
    Seqlist se;
    Seqlist sq(se); //出现浅拷贝也就是重复析构,由于sq没有申请额外的空间
                  //导致sq和se指向同一个堆空间。
}

由于sq调用拷贝构造函数,没有申请额外的空间,导致sq和se指向同一个堆空间。析构是会导致重复析构。
请添加图片描述
请添加图片描述

内存泄漏:

int main()
{
Seqlist se;
Seqlist sq;
sq = se;
}

请添加图片描述
请添加图片描述

改造拷贝运算符:

Seqlist(const Seqlist& s)
{
    maxsize = s.maxsize;
    cursize = s.cursize;
    data = (int*)malloc(sizeof(int)*s.cursize);
    memcpy(data, s.data,sizeof(int)*s.cursize);
}

请添加图片描述

运算符重载改造(避免了内存泄漏)

   Seqlist& operator=(const Seqlist& s)
    {
        if (this != &s)
        {
            maxsize = s.maxsize;
            cursize = s.cursize;
            data = (int*)malloc(sizeof(int) * s.cursize);
            memcpy(data, s.data, sizeof(int) * s.cursize);
        }
        return *this;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值