1、案例一:
#include <iostream>
#include <cstring>
using namespace std;
class Pixel
{
private:
char *name;
int x,y;
public:
Pixel(char *nm = "noname",int xx = 0,int yy = 0){ x = xx;y = yy;name = nm; }//浅拷贝
void show(){ cout<<x<<" "<<y<<" "<<name<<endl; }
};
int main(void)
{
char str[10] = "Tom";
Pixel p1(str);
p1.show();
strcpy(str,"Winner");
p1.show();
return 0;
}
结果:
p1.show()第二次出现了变化,原因是因为str被改变了,两个变量都指向str,所以第二次输出为Winner。(浅拷贝问题一:值被修改)
案例一更改main函数:
int main(void)
{
char str[10] = "Tom";
Pixel p1(str);
p1.show();
delete[] str;
p1.show();
return 0;
}
此时会出现指针悬挂的情况。(浅拷贝问题而:指针悬挂)
2、修改后(深拷贝)
#include <iostream>
#include <cstring>
using namespace std;
class Pixel
{
private:
char *name;
int x,y;
public:
Pixel(char *nm = "noname",int xx = 0,int yy = 0)
{
x = xx;y = yy;
name = new char(strlen(nm)+1);//开辟新空间
strcpy(name,nm);
}
~Pixel()
{
if(name != NULL) delete[] name;//回收空间
}
void show(){ cout<<x<<" "<<y<<" "<<name<<endl; }
};
小结:
浅拷贝:多个对象共用一块资源,同一个资源释放多次,崩溃或者内存泄漏
深拷贝:每个对象都拥有自己的资源,必须显示提供拷贝构造函数和赋值运算符。