C++之 String类 浅拷贝

在C语言当中,我们定义一个字符串是怎么定义的呢?

char arr="Hello";    //这是一个字符串

在字符串里我们有很多相关的操作,比如strlen strcmp strcpy等等,但是有些情况下我们来实现这些函数时有些不方便,C++就给我们提供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;
}

看起来好像是没有什么问题,编译也能够通过,是不是就没有问题了呢?
我们来调试一下就知道了:

可以看出来,在我们要去释放s1这个空间时,编译器崩溃了。
**原因就是:**s2和s1共用同一块空间,我们知道析构函数是先析构 s2 在析构 s1,既然是这样,在析构完s2再来析构s1出问题不是很正常嘛!这时s1 相当于是一个野指针了。

这就是我们常说的浅拷贝:从给出的例子上来看,浅拷贝只是将对象中的值拷贝过来,如果对象管理了资源,最后就会导致多个对象共用同一份资源,在一个对象被销毁时该资源就会被释放掉,其他函数再来引用这块资源时程序就会崩溃。

因此,在以后写string类时一定不能写成这种形式的代码,那么我们要怎么解决这个缺陷呢?
可以采用深拷贝的形式进行修改。
深拷贝:可以参考我的另一篇博客博客https://blog.csdn.net/qq_39412582/article/details/81515037

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量, mt=导师, ld=直属领导, cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld 找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld 的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc 吗?” ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务