Перегрузка + Оператор - PullRequest
0 голосов
/ 27 марта 2011

Отладчик выдает мне «плохой ptr», когда я создаю новый строковый массив в этом конструкторе, но только когда мой метод оператора перегрузки создает новый объект MyString ... в замешательстве.

Вот мой конструктор

MyString::MyString()
{
     stringSize = 0;
     stringCap = 16;
     stringArray = new char[stringCap + 1];
     stringArray[0] = '\0';
}

Вот мой метод оператора перегрузки

MyString operator+(const char* leftOp, const MyString& rightOp)
{
     MyString result; // new object used to store result
     result.stringSize = strlen(leftOp) + rightOp.stringSize;
     // if the string does not fit in the array
     if( result.stringSize > result.stringCap )
     {
         delete[] result.stringArray;
         result.stringCap = ( result.stringSize + 15 ) & ~15;
         result.stringArray = new char[result.stringCap + 1];
     }
     strcpy(result.stringArray, leftOp);
     strcat(result.stringArray, rightOp.stringArray);
     return result;
  }

Вот мой конструктор копирования, который отладчик тоже никогда не получает

MyString::MyString(const MyString& s)
{
    stringSize = s.stringSize;
    stringCap = s.stringCap;
    //stringArray[stringCap + 1];
    stringArray = new char[stringCap + 1];
    stringArray = s.stringArray;
}

Ответы [ 2 ]

3 голосов
/ 27 марта 2011

Что ж, когда этот метод вернется, "результат" будет скопирован, а оригинал уничтожен.Если деструктор удаляет массив, и нет интеллектуального конструктора копирования, который бы гарантировал, что новая копия содержит действительный новый массив, у вас будут проблемы.

Но вы сказали, что компилятор говорит что-то о плохом указателе - где?Какая линия?

1 голос
/ 27 марта 2011

Поскольку из вашего фрагмента кода нет ничего неправильного, мое шестое чувство подсказывает мне, что вы НЕ написали конструктор копирования и работаете с заданным по умолчанию компилятором, или, возможно, stringArray не является нулевым значением.прекращенная строка!

РЕДАКТИРОВАТЬ:

В вашем конструкторе копирования это неправильно:

stringArray = s.stringArray; //wrong!

Используйте strcpy вместо:

strcpy(stringArray, s.stringArray); //correct!

Убедитесь, что все ваши строки имеют нулевое окончание!

...