3-1 C++深拷贝浅拷贝
浅拷贝例子:
浅拷贝例子plus:
上图浅拷贝存在的问题:arr2的指针和arr1的指针指向同一个内存,销毁的时候同一段内存被销毁两次;
解决方法:深拷贝(不是简单的数值拷贝,而把堆中内存的数据也进行拷贝):
3-2 C++拷贝实践
Array.h
class Array
{
public:
Array(int count);
Array(const Array &arr);
~Array();
void setCount(int count);
int getCount();
void printAddr();
void printArr();
private:
int m_iCount;
int *m_pArr;
};
Array.cpp
#include "Array.h"
#include<iostream>
using namespace std;
Array::Array(int count)
{
m_iCount = count;
m_pArr = new int[m_iCount];
for (int i=0;i<m_iCount;i++)
{
m_pArr[i] = i;
}
cout<<"Array()"<<endl;
}
Array::Array(const Array &arr)
{
m_iCount=arr.m_iCount;
m_pArr = new int[m_iCount];//深拷贝
for(int i=0;i<m_iCount;i++)
{
m_pArr[i]=arr.m_pArr[i];
}
cout<<"Array(const Array &arr)"<<endl;
}
Array::~Array()
{
delete m_pArr;
m_pArr = NULL;
cout<<"~Array()"<<endl;
}
void Array::setCount(int count)
{
m_iCount=count;
}
int Array::getCount()
{
return m_iCount;
}
void Array::printAddr()
{
cout<<"m_pArr:"<<m_pArr<<endl;
}
void Array::printArr()
{
for(int j = 0;j<m_iCount;j++)
{
cout<<m_pArr[j]<<" ";
}
cout<<endl;
}
demo.cpp
#include<iostream>
#include<stdlib.h>
#include "Array.h"
using namespace std;
int main(void)
{
Array arr1(5);
Array arr2(arr1);
arr1.printAddr();
arr2.printAddr();
arr1.printArr();
arr2.printArr();
system("pause");
return 0;
}
运行结果:
Array()
Array(const Array &arr)
m_pArr:01375310
m_pArr:01375360
0 1 2 3 4
0 1 2 3 4
请按任意键继续. . .