嘉兴学网站建设,个人nas做网站,网址怎么做小程序类的二维码,北京市装修公司前10名目录 1. 浅拷贝
2. 深拷贝 1. 浅拷贝 浅拷贝只是拷贝一个指针#xff0c;并没有新开辟一个地址#xff0c;拷贝的指针和原来的指针指向同一块地址#xff0c;如果原来的指针所指向的资源释放了#xff0c;那么再释放浅拷贝的指针的资源就会出现错误 对一个已知对象进行拷贝…目录 1. 浅拷贝
2. 深拷贝 1. 浅拷贝 浅拷贝只是拷贝一个指针并没有新开辟一个地址拷贝的指针和原来的指针指向同一块地址如果原来的指针所指向的资源释放了那么再释放浅拷贝的指针的资源就会出现错误 对一个已知对象进行拷贝编译系统会自动调用一种构造函数——拷贝构造函数如果用户未定义拷贝构造函数则会调用默认拷贝构造函数。
举个栗子
#include iostream
using namespace std;class Student
{
private:int num;char *name;
public:Student();~Student();
};Student::Student()
{name new char(20);cout Student endl;}
Student::~Student()
{cout ~Student (int)name endl;delete name;name NULL;
}int main()
{{// 花括号让s1和s2变成局部对象方便测试Student s1;Student s2(s1);// 复制对象}system(pause);return 0;
} 执行结果调用一次构造函数调用两次析构函数两个对象的指针成员所指内存相同这会导致什么问题呢name指针被分配一次内存但是程序结束时该内存却被释放了两次会导致崩溃 这是由于编译系统在我们没有自己定义拷贝构造函数时会在拷贝对象时调用默认拷贝构造函数进行的是浅拷贝即对指针name拷贝后会出现两个指针指向同一个内存空间。 所以在对含有指针成员的对象进行拷贝时必须要自己定义拷贝构造函数使拷贝后的对象指针成员有自己的内存空间即进行深拷贝这样就避免了内存泄漏发生。 2. 深拷贝 深拷贝不仅拷贝值还开辟出一块新的空间用来存放新的值即使原先的对象被析构掉释放内存了也不会影响到深拷贝得到的值。在自己实现拷贝赋值的时候如果有指针变量的话是需要自己实现深拷贝的。
举个栗子
#include iostream
using namespace std;class Student
{
private:int num;char *name;
public:Student();~Student();Student(const Student s);//拷贝构造函数const防止对象被改变
};Student::Student()
{name new char(20);cout Student endl;}
Student::~Student()
{cout ~Student (int)name endl;delete name;name NULL;
}
Student::Student(const Student s)
{name new char(20);memcpy(name, s.name, strlen(s.name));cout copy Student endl;
}int main()
{{// 花括号让s1和s2变成局部对象方便测试Student s1;Student s2(s1);// 复制对象}system(pause);return 0;
} 执行结果调用一次构造函数一次自定义拷贝构造函数两次析构函数。两个对象的指针成员所指内存不同。 总结浅拷贝只是对指针的拷贝拷贝后两个指针指向同一个内存空间深拷贝不但对指针进行拷贝而且对指针指向的内容进行拷贝经深拷贝后的指针是指向两个不同地址的指针。
再说几句 当对象中存在指针成员时除了在复制对象时需要考虑自定义拷贝构造函数还应该考虑以下两种情形 1.当函数的参数为对象时实参传递给形参的实际上是实参的一个拷贝对象系统自动通过拷贝构造函数实现
2.当函数的返回值为一个对象时该对象实际上是函数内对象的一个拷贝用于返回函数调用处。
3.浅拷贝带来问题的本质在于析构函数释放多次堆内存使用std::shared_ptr可以完美解决这个问题。