weixin_45524887 2026-01-23 18:29 采纳率: 83.3%
浏览 8
已结题

其中String sailor 调用了构造函数,构造函数中用new申请了内存)而且书上说的是可能引用了,如果没用引用那delete不会发生错误吗(相关搜索:赋值运算符)

在c++类中,我想重载赋值运算符,通过深度复制将一个对象赋值给另一个对象

String& String::operater = (const String & st)
{
    if (this == &st)
        return *this;
    delete [] str;
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
    return *this;
}

书上说由于目标对象可能引用了以前分配的数据,所以函数应使用delete[]来释放这些数据。这句话是什么意思呀,(有解释说可能是使用下面这条语句:String sailor = String(sports); 其中String sailor 调用了构造函数,构造函数中用new申请了内存)而且书上说的是可能引用了,如果没用引用那delete不会发生错误吗?

  • 写回答

3条回答 默认 最新

  • 火花20180731 2026-01-26 11:28
    关注

    String类用字符数组保存字符串,使用运算符new[] 分配一个字符数组的堆内存,将地址备份到成员变量char *str中
    该类的设计是:str始终不为nullptr,且其备份的堆内存地址始终是有效地址(即str不为悬浮指针,delete[]后立马就要赋值新new的堆内存的地址)
    所以必须要在初始化阶段(即构造函数中)new一个初始的堆内存
    后面每次覆盖存储新的字符串,可能长度不匹配,比较粗暴的做法是直接把之前的delete[]掉,为新字符串重新new堆内存

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月5日
  • 已采纳回答 1月28日
  • 创建了问题 1月23日