深拷贝和浅拷贝使用问题

时间:2022-02-25 19:47:02

定义:

如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这是深度复制或深拷贝。

复制的另一种形式只是复制指针值,称为成员复制或浅复制或浅拷贝。它只复制指针信息,而不会深入“挖掘”以复制指针引用的结构。

简单说就是:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

c++ primer plus里深浅拷贝的图示:

深拷贝和浅拷贝使用问题深拷贝和浅拷贝使用问题

图中的是深拷贝和浅拷贝示意图,可见深拷贝中,ditto = motto语句使得ditto指向另一块新开辟的内存存放被拷贝的内容,如果是浅拷贝,ditto也会指向2400地址。这就是区别。

深拷贝和浅拷贝的区别很多文章有讲,这里说下两者何时采用,具体的例子可以参考博客:http://blog.csdn.net/feitianxuxue/article/details/9275979

1. 只要类里有指针时,就要写自己版本的拷贝构造函数和赋值操作符函数。这两个函数中可以拷贝那些被指向的数据结构,从而使每个对象都有自己的拷贝;或者可以采用某种引用计数机制,去跟踪当前有多少个对象指向某个数据结构。(也可以静态计数对象的个数,比如c++ primer plus第六版的例子,static int num_strings)

2. 某些类在实现拷贝构造函数和赋值操作符时,可以确信程序中不会做拷贝和赋值操作的时候,去实现它们会得不偿失,因此可以:只声明这些函数(声明为private成员)而不去定义实现它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。

3. 浅拷贝在构造和析构对象时容易产生问题,如无必要尽量不用浅拷贝。当我们要传递复杂结构的信息,而又不想产生另一份数据时,可以使用浅拷贝,比如引用传参。

4. 智能指针是浅拷贝概念的增强。比如智能指针可以维护一个引用计数来表明指向某块内存的指针数量,只有当引用计数减至0时,才真正释放内存。