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++中深拷贝和浅拷贝问题的主要内容,如果未能解决你的问题,请参考以下文章