0

메모리 관리 : 문자 배열 및 = 연산자메모리 관리 : 문자 배열 및 = 연산자

Q. 메모리 관리 측면에서 다음 코드로 어떤 오류가 있습니까?

class String 
{ 
public: 
String(const char right[]); 
String& operator= (const String& right); 
int length() const; 
private: 
char* buffer; 
int len; 
}; 

int String::length() const {return len;} 

String::String(const char right[]) 
{ 
    len = 0; 
    while (right[len] != '\0') 
    len++; 
    buffer = new char[len+1]; 
    for (int i = 0; i < len; i++) 
    buffer[i] = right[i]; 
    buffer[len] = '\0'; 
} 

String& String::operator= (const String& right) 
{ 
    int n = right.length(); 
    for (int i = 0; i <= n; i++) 
    buffer[i] = right.buffer[i]; 
    return *this; 
} 

답변. 실마리가 없습니다 ... 저를 도울 수 있습니까? 배열 크기가 괜찮은 것 같습니다 ... new 연산자 ... 삭제 연산자가 없기 때문에 매달린 포인터 때문입니까? 또는 3의 규칙?

귀하의 도움에 감사드립니다. 알려 주시기 바랍니다. 코드가있는 방법이 없기 때문에 감사합니다,

+1

[Rule of Three] (http://en.wikipedia.org/wiki/Rule_of_three_ (C % 2B % 2B_programming))가 구현되어 있지 않습니다. 즉, 발생하기를 기다리고있는 오류를 의미합니다. 대입 연산자는 구현시 매우 모호합니다. 생성자, 나쁘지는 않지만 여전히 보석은 아닙니다. 마지막으로 소멸자가 없습니다. 이는 메모리 누수 팩토리가 그 밖의 모든 것의 맨 위에 있다는 것을 의미합니다. – WhozCraig

+1

'operator ='는 버퍼 오버 플로우가 일어나기만을 요구하며, 소멸자도 복사 할당 연산자도 없습니다 ... – Yuushi

+0

명백한 정말 나쁜 것 외에도 생성자에서 문자열 길이를 수동으로 계산할 필요가 없습니다. 또는 수동 복사를위한 것입니다. –

답변

0

당신이 소멸자가없는 경우 나

~String() 
{ 
    if(buffer) 
     delete [] buffer; 
    len = 0; 
} 

String(int length) 
{ 
    buffer = new char[length]; 
    len = length; 
} 

String String::operator = (String rhs) 
{ 
    if(this != &rhs) 
    { 
     delete [] buffer; 
     buffer = new char[strlen(rhs.m_str) + 1]; 
     strcpy(buffer, rhs.buffer); 
    } 

    return *this; 
} 

을 제안 할 수있는 모든, 당신은 당신의 클래스의 버퍼를 새로운마다, 그것은 메모리 누수가 될 것입니다 그것을 없애는 것.

+0

'delete'를 사용할 때'NULL'을 검사 할 필요가 없습니다. 'operator ='는'const String &'을 취해'String &'를 돌려 주어야합니다. 예외 안전을 위해서, 항상'delete' 전에 새로운 공간을 할당하십시오 ('new'가 던질 수 있기 때문에 - 객체가 일관성있는 상태로 남을 것입니다). – Yuushi