C++ 浅拷贝和深拷贝

2018-04-19  创建人:Ruo_Xiao
开发环境:VS2010
邮箱:xclsoftware@163.com

1、浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,其实两个指针指向的是同一个内存区域。
2、深拷贝:将一个指针按照另一个指针进行申请内存,即:两个指针指向的是不同的内存区域。
3、栗子:

#include <string>
#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        piTest = nullptr;
        piTest = new int[3]();
        for (int i=0;i<3;++i)
        {
            piTest[i] = i;
        }
    }
    A(const A &a)
    {
        piTest = nullptr;
        piTest = new int[3]();
        for (int i=0;i<3;++i)
        {
            piTest[i] = i;
        }
    }
    ~A()
    {
        if (piTest!=nullptr)
        {
            delete []piTest;
            piTest = nullptr;
        }
    }
public:
    int *piTest;
};

int main() 
{
    A a1;
    A a2(a1);
    cout<<"a1.piTest = "<<a1.piTest<<ends<<"a2.piTest = "<<a2.piTest<<endl;
    cin.get();
    return 0;
}

上述栗子的结果是:
这里写图片描述
若注释掉代码中的“A(const A &a)”的函数,则结果如下:
这里写图片描述
4、解析:
(1)对于类的拷贝构造函数,若使用对象建立的默认拷贝构造函数,则对于类的成员变量来说是简单的赋值,即:浅拷贝。这种情况就造成了指针指向了同一个内存区域,释放内存时,假设a1释放完成,由于a2的piTest和a1的piTest指向的是同一块区域,则a2释放内存时就会造成内存访问错误。
(2)若自己建立拷贝构造函数,则进行的是深拷贝,这样两个piTest指向的内存就不一样了。释放对象时也不会造成内存泄露。

猜你喜欢

转载自blog.csdn.net/itworld123/article/details/80002129