2013-03-20 3 views
2

그래서 C++에서 OOP를 배우고 있었고, 물론 (물론 목적을 배우기 위해) 내 자신의 문자열 클래스를 작성하는 것이 좋을 것이라고 생각했습니다. 나는 해결 방법을 모르는 문제를 생각해 냈습니다. 다음은 코드의 일부입니다.메모리 누수 피하기

class String { 
    char *str; 
public: 
    String(char const *str); 
    ~String(); 
    String operator + (char const *str); 
}; 

String::String(char *str) { 
    this->str = _strdup(str); 
} 

String::~String() { 
    free(this->str); 
} 

String String::operator+(char const *str) { 
    char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1); 
    strcpy(temp, this->str); 
    strcat(temp, str); 
    return temp; 
} 

이 코드는 메모리 누수의 원인입니다. "operator +"의 반환은 더 많은 메모리를 할당하여 temp를 복사하는 생성자를 호출하고 어떻게 자유롭게 할 수 있는지 발견 할 수 없었습니다.

+9

당신은 세 가지의 규칙은 다음되어야한다 (물론, 이것은 당신이 복사 생성자의 정확한 정의를 제공하고, 할당 연산자 가정한다) :

그런 다음 operator+는 간단한 작업이된다 /다섯. 또한,'malloc'과'free'에'new []'와'delete []'를 선호하십시오. – chris

+1

전체적으로 NULL 매개 변수 검사와 철저히 설명되지 않은 반환 값은 말할 것도 없습니다. – WhozCraig

+0

자신의 문자열 클래스를 작성하는 것은 좋은 학습 목적입니다 ...하지만 좋은 문자열 클래스를 작성하는 것은 간단한 작업이 아닙니다. –

답변

7

operator +String을 반환하지만 char*은 컴파일러가 생성자를 사용하여 암시 적으로 변환한다는 것을 의미합니다. 이렇게하면 문자열은 복사되지만 원본이 누출되지는 않습니다.

이 다른 제안대로, 코드를 개선하기 위해 할 수있는 것들이 많이 있습니다,하지만 당신은이 작업을 수행 할 수있는 실제 누수 해결하려면 :

String String::operator+(char const *str) { 
    char *temp = (char *) malloc(strlen(str) + strlen(this->str) + 1); 
    strcpy(temp, this->str); 
    strcat(temp, str); 
    String strTmp(temp); 
    free(temp); 
    return strTmp; 
} 
+0

+1 나는 정확히 똑같은 대답을 쓰는 중이었습니다 – Lorkenpeist

+0

미래의 방문자를 위해이 대답은 당신이 복사 생성자와 사본 할당 연산자를 작성했다고 가정한다고 가정합니다. 그렇지 않으면 방금 누설을 두 번'free()'로 바꾸고 충돌합니다. – mythagel

1

operator = 및 copy 생성자를 구현하는 것을 잊었습니다. 자신 만의 것을 제공하지 않으면, 컴파일러는 메모리 누수의 원인이되는 회원 현명한 복사본을 작성하기 위해이를 구현합니다.

+0

나는 코드를 여기에 넣지 않았다. 필요한 경우 - 말해 주면 추가하겠습니다. – Arnas

+1

@Arnas 죄송합니다. 그것이 어디에 문제가되는지에 대한 중복 질문의 수를 믿지 않을 것입니다. – chris

3

문자열 클래스를 작성하는 것은 간단한 일이 아니다을, 네가 제대로하고 싶다면. 당신은 내가 recommandations의 몇 가지를 할 수 직면하고있는 특정 문제 ... 들어

append() 또는 큰 버퍼 복사 내용을 생성 operator+=는, 내부 버퍼를 스왑과 새로 이전을 작성 출시 구현합니다.

String operator+(String lhs, String const & rhs) { 
    lhs += rhs;     // lhs.append(rhs); 
    return lhs; 
}