用类模拟一个容器
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;
}