c++字符串重载问题,望高手指点!!!

来源:百度知道 编辑:UC知道 时间:2024/05/14 17:23:40
我自己写的一个简单的字符串类,注释的地方为什么不能删除动态分配的内存(编译时无错,运行时出错),不删除会有内存泄漏吧
#include <iostream>
using namespace std;

class MyString
{
public:
MyString();
MyString(char *a);
MyString(MyString &mc);
~MyString();
int getLength();
char *getStr();
MyString operator = (const char *str);
MyString operator = (MyString m);
MyString operator + (MyString ms);
private:
char *myString;
};

MyString::MyString()
{
myString = NULL;
}

MyString::MyString(char *a)
{
if (a != NULL)
{
myString = new char[strlen(a) + 1];
strcpy(myString, a);
}
else
{
myString = NULL;
}
}

MyString::MyString(MyString &mc)
{
myString = NULL;
if (mc.myString != NULL)
{
myString = new char[strlen(mc.myString) + 1];
strcpy(myString, mc.myString);
}
}

MyString::~MyString

因为你长度没申请够,而且operator+有问题,修改如下:。

friend MyString MyString::operator + (MyString ms1,MyString ms2)
{
char *str = new char[ms1.getLength()+ms2.getLength()+1]; //这里长度不够
strcpy(str, ms1.myString);
strcat(str, ms2.myString);
MyString m(str);
delete[] str;
return m;
}

另外,其实全局operator+效率比较低,建议重写operator+=如下

MyString &MyString::operator += (MyString ms) //返回引用
{

char *str = new char[ms.getLength()+getLength()+1]; //这里不够
strcpy(str, myString);
delete [] myString;
strcat(str, ms.myString);
mystring = str;

return *this;
}

这样可以用
MyString s,s2;

s += s2;

不过要看情况使用了

MyString MyString::operator + (MyString ms)
{
char *str = new char[getLength()+1];
strcpy(str, myString);
strcat(str, ms.myString);
MyString m(str); //这里出错了, 构造函数里面.
delete[] str;
return m; //这是一个局部变量, 怎么返回啊?
}