深拷贝,即为每个指针创建一个单独的内存,然后再复制数据。
1. 面向过程的深拷贝
把前面的浅拷贝程序进行适当的修改,如下:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//深拷贝
//下面程序,从键盘获取4个字符串,然后输出到屏幕
int main()
{
char buf[100];
char* strArr[4];//长度为4的字符指针数组,分别指向4个字符串
for (int i = 0; i < 4; i++)//从键盘获取4个字符串
{
cin >> buf;
//strArr[i] = buf;//这是浅拷贝
//下面的是深拷贝
strArr[i] = (char*)malloc(strlen(buf) + 1);//1.创建单独的内存
strcpy(strArr[i],buf);//2.复制数据
}
for (int i = 0; i < 4; i++)//把4个字符串输出到屏幕
cout << strArr[i] << " ";
//最后需要释放动态内存
for (int i = 0; i < 4; i++)
free(strArr[i]);
return 0;
}
从上面的程序能够正常的输出。
第12行,为每个字符串创建单独的内存,用于存放数据。
第13行,将数据从buf复制到新创建的内存。
第20,21行,释放每个字符串单独创建的内存,否则出现内存泄漏。
2. 面向对象的深拷贝(类)
这个过程比较复杂,下面的String类针对浅拷贝的问题,重新实现了拷贝构造函数和赋值=运算符函数。