2013-05-31 4 views
0

Мне нужно создать перегруженный класс String для домашнего задания. Я столкнулся с проблемой при тестировании некоторых операторов:C++ куча коррупции с использованием delete [] и перегрузка + =

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; 
    } 
} 

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

+3

'delete []' на нулевой указатель является noop. Нулевая проверка в 'operator + =' не дает никаких преимуществ. – chris

+0

Ваш код небезопасен, если какая-либо новая операция вызовет исключение. –

ответ

8
_str = new char(_len+1); 

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

_str = new char[_len+1]; 

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

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

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

+2

Ничего себе, хороший глаз !! – wilsonmichaelpatrick

+0

, если следовать первому пути, tmp также необходимо удалить в конце метода –

+0

Спасибо ОЧЕНЬ много, я полностью забыл об этом и был глубоко локтем по неверному пути. – Flexo1515

 Смежные вопросы

  • Нет связанных вопросов^_^