C++之 String类 浅拷贝

举报
Tracy 发表于 2019/10/15 21:46:33 2019/10/15
【摘要】 博客原文:https://blog.csdn.net/qq_39412582/article/details/81514877在C语言当中,我们定义一个字符串是怎么定义的呢?char str="hello"; //这就是一个字符串,双引号括起来的就是一个字符串在字符串里我们有很多相关的操作,比如strlen strcmp strcpy等等,但是有些情况下我们来实现这些函数时有些不方便,C...
博客原文:https://blog.csdn.net/qq_39412582/article/details/81514877
在C语言当中,我们定义一个字符串是怎么定义的呢?
char str="hello";   //这就是一个字符串,双引号括起来的就是一个字符串
在字符串里我们有很多相关的操作,比如strlen strcmp strcpy等等,但是有些情况下我们来实现这些函数时有些不方便,C++就给我们提供string这种类型方便了很多操作。
在string类中,我们简单的封装了构造函数,拷贝构造函数,赋值运算符重载和析构函数,能够实现基本的功能。在string类中,我们简单的封装了构造函数,拷贝构造函数,赋值运算符重载和析构函数,能够实现基本的功能。

浅拷贝

边看边思考,这段代码有没有问题?
class String{public:
    String(const char* pStr="") 
    {        if (NULL == pStr)
        {
            _pStr = new char[1];
            *_pStr = '\0';    //字符串是以"\0"为结束标志
        }        else
        {
            _pStr = new char[strlen(pStr) + 1];  //strlen不会计算结束标志符"\0"但它也占了空间,因此要加 1 
            strcpy(_pStr, pStr);
        }
    }

    String(const String& s)
        :_pStr(s._pStr)
    {}

    String& operator=(const String& s)
    {        if (this != &s)    //先检测是不是自己给自己赋值
        {
            _pStr = s._pStr;
        }        return *this;
    }
    ~String()
    {        if (_pStr)
        {            delete[] _pStr;
            _pStr = NULL;
        }
    }private:    char* _pStr;
};void TestFunc(){String s1("hello");String s2(s1); 
String s3;
s3 = s1;
}int main(){
    TestFunc();
    retutn 0;
}
看起来好像是没有什么问题,编译也能够通过,是不是就没有问题了呢?
我们来调试一下就知道了:


70

可以看出来,在我们要去释放s1这个空间时,编译器崩溃了。

原因就是:

s2和s1共用同一块空间,我们知道析构函数是先析构 s2 在析构 s1,既然是这样,在析构完s2再来析构s1出问题不是很正常嘛!这时s1 相当于是一个野指针了。
这就是我们常说的浅拷贝:从给出的例子上来看,浅拷贝只是将对象中的值拷贝过来,如果对象管理了资源,最后就会导致多个对象共用同一份资源,在一个对象被销毁时该资源就会被释放掉,其他函数再来引用这块资源时程序就会崩溃。这就是我们常说的浅拷贝:从给出的例子上来看,浅拷贝只是将对象中的值拷贝过来,如果对象管理了资源,最后就会导致多个对象共用同一份资源,在一个对象被销毁时该资源就会被释放掉,其他函数再来引用这块资源时程序就会崩溃。
因此,在以后写string类时一定不能写成这种形式的代码,那么我们要怎么解决这个缺陷呢?因此,在以后写string类时一定不能写成这种形式的代码,那么我们要怎么解决这个缺陷呢?
可以采用深拷贝的形式进行修改。

#####深拷贝链接:https://blog.csdn.net/qq_39412582/article/details/81515037

本文转载自异步社区。

文链接

https://www.epubit.com/articleDetails?id=N0a4d8e97-5662-491d-8bcf-346caf4e1f4e

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。