我遇到这个问题,我试图为我的自定义字符串类重载add函数,所以我创建了一个临时对象,将两个对象的长度和数组一起添加,但是我不断得到分段错误而且我没有&# 39;不知道为什么。我已经测试了我的赋值运算符和我的相等运算符,它们都完美地工作。
myString myString::operator+(const myString& str) const{
int p = 0;
myString tmp;
tmp.sLength = sLength + str.sLength;
tmp.s = new char[tmp.sLength];
while (p != (sLength - 1))
{
tmp.s[p] = s[p];
p++;
}
while (p != (tmp.sLength - 1))
{
tmp.s[p] = str.s[(p - sLength)];
p++;
}
return tmp;
//tmp.s = NULL;
}
myString& myString::operator=(const myString& str)
{
if (this != &str)
{
if ( s != NULL)
{
if (str.s == NULL)
{
sLength = 0;
s = NULL;
}
else
{
delete [] s;
s = new char [str.sLength];
sLength = str.sLength;
for (int i = 0; i < sLength; i++)
s[i] = str.s[i];
}
}
}
return *this;
}
答案 0 :(得分:1)
当这个循环
while (p != (sLength - 1))
{
tmp.s[p] = s[p];
p++;
}
结束其迭代变量p
将等于sLength -1
。
因此在这个循环中
while (p != (tmp.sLength - 1))
{
tmp.s[p] = str.s[(p - sLength)];
p++;
}
在第一次迭代中
tmp.s[sLength -1] = str.s[(sLength -1 - sLength)];
即
tmp.s[sLength -1] = str.s[(-1)];
^^^^
还不清楚为什么循环使用类似p != sLength - 1
的条件。他们为什么不使用像p != sLength
这样的条件?
复制赋值运算符也是错误的。
例如,如果s!= NULL,则只需为其分配NULL,而不删除先前分配的内存。
if ( s != NULL)
{
if (str.s == NULL)
{
sLength = 0;
s = NULL;
^^^^^^^^
此外,如果s
等于NULL
,那么您为它分配任何内容,尽管str.s
可以是非空指针。
还出现了一个问题,为什么在循环中使用以下条件
for (int i = 0; i < sLength; i++)
^^^^^^^^^^^
s[i] = str.s[i];
而不是
for (int i = 0; i < sLength - 1; i++)
^^^^^^^^^^^^^^^
s[i] = str.s[i];
在operator +
?