nik666 2015-06-27 09:09 采纳率: 33.3%
浏览 2982

关于C++重载函数的问题将实现两个字符串连起来

#include
using namespace std;
class UString
{
protected:
char *str;
int len;
public:
UString()
{
str=0;
len=0;
}
UString(char *c)
{
len=strlen(c);
str=new char(len+1);
strcpy(str,c);
}
UString(UString &a)
{
if(!str) delete str;
str=new char[strlen(a.str)+1];
strcpy(str,a.str);
}
~UString()
{
delete str;
}
UString operator+(const UString &a)
{
UString temp;
temp.str=new char[strlen(str)+strlen(a.str)+1];
strcpy(temp.str,str);
strcat(temp.str,a.str);
return temp;
}
void show()
{
cout<<str<<endl;
}
};
int main()
{
UString str1("abc"),str2("def"),c;
c=str1+str2;
c.show();
return 0;
}

求大神解答下!!

  • 写回答

1条回答

  • fourth_leaf 2015-06-27 10:17
    关注

    请问你的程序是否一运行就崩溃了。
    首先,拷贝构造函数UString(UString &a)中的逻辑 为空则释放指针指向的空间本身就是错误的,释放空指针本身就会引起段错误
    然后,请用delete[] str,替换为 delete str。str指向的是动态数组,使用普通的释放方式应该会有语法错误
    其次,代码不严谨,~UString()中,假如str为空,对它进行进行空间释放肯定会出错。
    最后,最隐蔽也是致命的bug,请考虑使用深拷贝。c=str1+str2一行会调用operator+ 和 operator=,operator+中有个自动变量temp,函数调用结束会清理temp,释放temp中的指针,return过程会发生UString对象的拷贝构造,构造一个UString临时对象(方便后面陈述称其为A),由于未定义拷贝构造函数那么会调用默认的,默认的实现会仅仅拷贝成员指针的值,那么A中的指针指向的空间早已因为temp的析构被释放,当c=str1+str2执行完必然也要释放A,此时重复释放A中指针就会产生错误。请重写复制构造函数和operator=。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!