2013-05-31 1 views
0

숙제를 위해 오버로드 된 String 클래스를 만들어야합니다.C++ 힙 손상으로 delete [] 및 overloaded + =

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