深复制与浅复制





浅复制的例子:

深复制与浅复制

对于上面的代码来说,一开始的时候没有分配str指向的单元,str就是野指针。那么,当在Test构造函数中用strcpy进行

指针的赋值的时候,str没有初始化就被使用了,这个时候str中放置的地址是系统自动分配的,并不是通过动态分配空间得到的,而系统自动分配的地址是不能被直接拿来用,不安全,所以会报错。


为了结局上面的问题,需要用深复制:(带有指针变量的类在初始化的时候应该做什么工作)

深复制与浅复制

需要注意的是strcpy的功能:

char *strcpy(char *dest,const char *src)

功能是从src地址开始且含有NULL结束符的字符串复制到以dest地址开始的字符串中,并返回指向dest的指针,通俗地说就是将src字符数组复制到dest数组中。

用strlen求字符串长度的时候是不算‘\0’的。

需要注意的是,用这种方式对str初始化之后,还要在析构函数中,释放str指向的空间。


综上,当类中有指针数据成员的时候,必须深复制。深复制也就是说,要首先给指针指向的单元分配空间(用new),再做其他操作。


深复制与浅复制

上面这种做法是最危险的,因为在调用构造函数的时候,在构造函数中,只是将指针变量进行赋值,所以

a和b两个对象中对于str其实是共用一个内存单元,所以在delete a之后,很有可能str也被释放了,所以str中所

指向的内存被释放,这时候再用对象b的话,可能就显示不出对象b中的str中的值了。