字符串类+运算符

时间:2016-11-19 02:57:33

标签: c++ arrays segmentation-fault

我遇到这个问题,我试图为我的自定义字符串类重载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;   
}

1 个答案:

答案 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 +