C++ 深/浅拷贝

  • 当类申请了堆中的资源,既类的成员使用new函数在堆中申请内存,并且进行了类的复制操作时,会出现这个问题。
  • 浅拷贝就是多了一个指针,指向了原来的内存,深拷贝是增加了一个指针,并且指向了原来的函数。

举例

  • 我们申明了String类
class String {
private:
    char * str;
public:
    String() :str(NULL) { }
    const char * c_str() const { return str; };
    String & operator = (const char * s);
    ~String();
};
  • 如果我们直接执行
String s1, s2;
s1 = "this";
s2 = "that";
s2 = s1;
  • 这种情况是,此时s2和s1指向了同一段内存,同时s2所指的内存将会成为内存垃圾,可能导致泄露。而我们需要的复制是两个指针指向的内存中的内容相同,于是我们对=进行重载
String & String::operator = (const String & s)
{
    if(str == s.str)
        return * this;
    if(str)
        delete[] str;
    if(s.str){  //s. str不为NULL才执行复制操作
    str = new char[ strlen(s.str) + 1 ];
        strcpy(str, s.str);
    }
    else
        str = NULL;
    return * this;
}
  • 这样重载后,在复制的时候将会开辟一段新的内存。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,803评论 1 32
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 8,025评论 1 5
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 5,496评论 0 1
  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 10,375评论 0 30
  • 色戒 你每个吻都带着激情的火焰在我体内燃烧。你亲舔着,吸吮着。游走每寸肌肤,从胸部到腹部。你都细细品尝。我在你身下...
    逆风飞翔的陀陀妈阅读 3,308评论 2 5