Трудно сказать, здесь ли проблема с вашим кодом.
Я бы посмотрел на других участников. Повиновались ли вы правилу 3 ?
Примечание:
Я бы отметил, что вы нарушаете фундаментальное правило ОО.
Вы не должны возиться с членами другого объекта, если на то нет very
веской причины.
Здесь ваш объект возится с результатом.
Код был бы чище, если бы вы написали его как:
MyString MyString::operator+(const char* rightOp) const
{
MyString result(*this); // make a copy of this.
result += rightOp; // Let result fiddle with its own members here.
return result;
}
Edit:
на основе комментария ниже.
Правило трех
В основном: если ваш объект владеет динамически выделяемой памятью (то есть он вызывает new / delete), то версия методов по умолчанию, сгенерированная компилятором, не будет работать так, как вы хотите; и вы должны определить свои собственные версии:
В основном:
* Copy Constructor
* Assignment Operator
* Destructor
* Not part of rule of 3, but you probably also need a normal constructor.
Самое простое - у вас, вероятно, уже есть деструктор (иначе не было бы повреждения), и оператор присваивания можно записать в терминах конструктора копирования. Поэтому все, что вам нужно сделать, это написать правильную версию конструктора копирования, и все должно работать.
/*
* Assignment operator using Copy and swap Idiom.
* Copy uses copy constructor (here done in pass by value)
*
* You then just swap the current content with the copy
*/
MyString& MyString::operator=(MyString rhs)
{
(*this).swap(rhs);
return *this;
}