Повреждение кучи в 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
, но с этим методом вам не нужно.