浅谈 c++的深拷贝与浅拷贝
初次见面
正如字面意思,深与浅无非是拷贝力度的大小。那么怎么理解深和浅呢?
深:将拷贝对象的所有属性复制一遍
浅:仅拷贝对象的地址
那么为什么要有浅拷贝与深拷贝呢?
总的目的来说,浅拷贝是为了提高速率,让程序员可以直接操纵对象地址,不用再花时间与内存去复制一份新的出来。显而易见可以看出浅拷贝是很方便操作的。
既然浅拷贝很好 那么我不防聊一聊它的坏处
浅拷贝的坏处
程序在设计的初期,并不希望我们把所有的事情都考虑好,更希望程序在运行的过程中自行的去拓展。例如我们要存储一个学生的信息,难道我们一开始就要把学生的最高使用上限就考虑到么,肯定不是的。所以出现了 new 和 delete 。使用 new 创建的变量会放在计算机内存的一个特定部分,直到 delete 调用后这个变量才会删除。这是 new 和 delete 使用的背景。
例子
1 |
|
1 |
|
main.cpp
1 |
|
当我们编译之后发现程序并没有错误,可是当程序运行的时候,程序会报错,触发了 GPF 错误(GPF 表示程序试图访问禁止的内存单元)这是一种很坏的现象。
1 | Start |
关于为什么会出现错误呢?
1.Private 里的 num_strings 错误
这种错误主要是程序调用 c++里的默认拷贝函数,复制了一份新的 StringBad 对象,而 Static 静态类型属于整个类并不属于某个对象,故临时产生的 StringBad 对象也会调用析构函数从而导致 num_strings –
2.@Q�eC# 文字乱码
1 | StringBad sports; |
我们可以发现其中 sports.str 只是指向了 headline1.str 的地址,但是由于 headlline1 在销毁的时候会调用 delete 将 str 从内存中删除掉,从而 sports.str 没有地址可寻.
如何解决?
创建复制构造函数
1 | StringBad::StringBad(const StringBad & st){ |