Повреждение кучи в C++ с использованием delete [] и перегружено +=

Я должен создать перегруженный класс String для домашнего задания. Я столкнулся с проблемой при тестировании некоторых операторов:

int main() {
    MyString i;
    cin >> i;
    cin.ignore(100, '\n');
    MyString temp = i;
    while(!(i > temp)) {
        temp += i;
        cin >> i;
        cin.ignore(100, '\n');
    }
    cout << endl << temp;
    return 0;
}

MyString operator+= (const MyString& op1) {
    _len += (op1._len);
    char* temp = new char[_len+1];
    strcpy(temp, _str);
    strcat(temp, op1._str);
    if(_str) {
        delete [] _str;
        _str = NULL;
    }
    _str = new char(_len+1);
    strcpy(_str, temp);
    return *this;
}

istream& operator>> (istream& inStream, MyString& in) {
    char temp[TSIZE];
    inStream >> temp;
    in._len = strlen(temp);
    if(in._str) {
        delete [] in._str;
        in._str = NULL;
    }
    in._str = new char[in._len+1];
    strcpy(in._str, temp);
    return inStream;
}

MyString(const MyString& from) {
        _len = from._len;
        if(from._str) {
            _str = new char[_len+1];
            strcpy(_str, from._str);
        } else _str = NULL;
    }

explicit MyString(const char* from) {
    if(from) {
        _len = strlen(from);
    _str = new char[_len+1];
        strcpy(_str, from);
    } else {
        _len = 0;
        _str = NULL;
    }
}

Я все еще очень новичок в этом, но, видимо, проблема возникает во второй раз, когда вызывается оператор +=, хотя не первый. Извините, если я не предоставил всю необходимую информацию, я не хотел включать больше, чем нужно. Спасибо за любую помощь

1 ответ

Решение
_str = new char(_len+1);

Используя круглые скобки вместо квадратных скобок, вы выделяете один символ и инициализируете его странным значением. Я почти уверен, что вы хотели выделить массив.

_str = new char[_len+1];

Но так как вы уже выделены tempпочему бы просто не использовать это?

_str = temp;
// strcpy(_str, temp); // delete this line

Это также устраняет утечку памяти. Вы не освобождали память, выделенную для temp, но с этим методом вам не нужно.

Другие вопросы по тегам