2 nik666 nik666 于 2015.06.27 17:09 提问

关于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个回答

u011547347
u011547347   2015.06.27 18: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=。

Csdn user default icon
上传中...
上传图片
插入图片