版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
先来看这样一段代码:
class test
{
public:
test(void) {p = new int; }
~test(void) {delete p; p = 0; }
private:
int *p;
};
正如我们平常使用一样,在类的构造函数中new指针,在析构函数中delete指针。表面上看这段代码没有任何问题,实际上却隐藏着很大的隐患。
当我们这样使用上面的类时:
int main(void)
{
test t1;
test t2 = t1;
test t3;
t3 = t2;
return 0;
}
这里test的构造函数调用了两次。t1和t3而test的析构函数却调用了3次。t1,t2,t3。由于t1,t2,t3分别包含一个指针。他们的指向为t1构造的时候分配的内存。
这样就产生了狠严重的问题。
1. t3构造时创建的内存没有被保存下来,这样就造成了内存泄露。
2. 由于上面调用了析构函数3次,也就是说,t1创建的指针要释放3次。这样就会出现很严重的问题。
好了,找到了问题,我们就知道如何来修改了。
class test
{
public:
test(void) {p = new int; }
~test(void)
{
delete p;
p = 0;
}
test(const test &t)
{
p = new int;
*p = *(t.p);
}
test& operator=(const test &t)
{
if (this != &t)
{
delete p;
p = new int;
*p = *(t.p);
}
return *this;
}
private:
int *p;
};
如果这段代码你理解的很透彻,那么C++中的4大函数你就已经完全掌握了。
test t;调用构造函数。
test t1(t);调用拷贝构造函数
test t2 = t1; 同样调用拷贝构造函数
test t3;
t3 = t1;这里才是调用赋值函数