美文网首页
C++ 深/浅拷贝

C++ 深/浅拷贝

作者: hey白启明 | 来源:发表于2019-03-10 20:06 被阅读0次
    • 当类申请了堆中的资源,既类的成员使用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;
    }
    
    • 这样重载后,在复制的时候将会开辟一段新的内存。

    参考资料

    相关文章

      网友评论

          本文标题:C++ 深/浅拷贝

          本文链接:https://www.haomeiwen.com/subject/huwyuqtx.html