c++中深拷贝和浅拷贝问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中深拷贝和浅拷贝问题相关的知识,希望对你有一定的参考价值。

在C++中深拷贝和浅拷贝问题还是比较重要的,简单介绍一下深拷贝和浅拷贝的意思,在C++中类默认有六个函数,拷贝构造函数就包括在其中,对于在程序运行的过程中,如果程序中没有自定义拷贝构造函数,那么程序将会使用自己的默认构造函数,在这个过程中,称为浅拷贝,用户自定义的拷贝构造函数称为深拷贝。

以下面的实际例子来加以说明深拷贝和浅拷贝之间的主要区别:

#include <iostream>

#include<string>

using namespace std;

class A

{

private:

char* _a;

public:

A( char* a=/*""*/NULL)

{

_a = new char[strlen(a) + 1];

cout << "A()" << endl;

}

~A()

{

if (_a != NULL)

delete _a;

_a = NULL;

cout << "~A()" << endl;

}

void show()

{

cout << _a << endl;

}

};

int main()

{

A a("123");

A aa(a);

getchar();

return 0;

}

这个时候对象a里面的_a与对象aa中的_a共用一块空间,这个时候程序调用析构函数的时候,这个共用空间就会被释放两次,程序将会出现问题.

深拷贝的时候,用户自己自定义一个拷贝构造函数,程序如下所示

#include <iostream>

#include<string>

using namespace std;

class A

{

private:

char* _a;

public:

A( char* a=/*""*/NULL)

{

_a = new char[strlen(a) + 1];

cout << "A()" << endl;

}

~A()

{

if (_a != NULL)

delete _a;

_a = NULL;

cout << "~A()" << endl;

}

A(const A &a)

{

_a = new char[strlen(a._a) + 1];

strcpy(_a, a._a);

}

void show()

{

cout << _a << endl;

}

};

int main()

{

A a("123");

A aa(a);

cout << &a << endl;

cout << &aa << endl;

getchar();

return 0;

}


本文出自 “局部和static变量” 博客,转载请与作者联系!

以上是关于c++中深拷贝和浅拷贝问题的主要内容,如果未能解决你的问题,请参考以下文章

浅析Python中深拷贝和浅拷贝

前端开发:JS中深拷贝和浅拷贝的区别

C++中,啥是深拷贝?啥是浅拷贝?

JS中深拷贝和浅拷贝记录及解决方法

python的复制,深拷贝和浅拷贝的区别

python for循环中的浅拷贝