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=。

    评论

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题