c++的类的默认拷贝构造函数执行的是浅拷贝,在类的成员变量是在栈上建立时,这种默认浅拷贝机制是没有问题的,但是如果类的成员变量是在堆上建立时,这就会导致重复析构同一内存空间的错误,因为默认的浅拷贝只是对地址进行拷贝,而没有重新分配内存,完成内容的拷贝,即深拷贝。
下面实现一个自己的string类(使用默认拷贝构造函数)
#include <iostream>
#include <string.h>
using namespace std;
//实现自己的string类
class MyString
{
public:
MyString(char *str)
{
cout<<"MyString(char *str)"<<endl;
_str=new char[strlen(str)+1]; //多申请一个字节用于存放'\0'
strcpy(_str,str);
}
~MyString()
{
cout<<"~MyString()"<<endl;
delete[] _str;
}
void print()
{
cout<<_str<<endl;
}
private:
char *_str;
};
int main()
{
MyString s1("c++ is the best language!");
s1.print();
MyString s2=s1;
s2.print();
return 0;
}
在linux平台下用gcc编译会出现如下的运行错误,两次free,注意在windows平台下会正确运行。
* Error in `./a.out’: double free or corruption (fasttop): 0x0000000000776030 *
在MyString类中添加自定义的拷贝构造函数,完成深拷贝
MyString(MyString &myString)
{
_str=new char[strlen(myString._str)+1];
strcpy(_str,myString._str);
}
程序正确输出为:
MyString(char *str)
c+++ is the best language!
MyString &myString
c+++ is the best language!
~MyString()
~MyString()
且用valgrind检测后没有内存泄漏。