2014-11-08 2 views
1

현재 내 (자신의) 문자열 클래스를 구현하고 있지만 substr() 메서드에 문제가 있습니다.로컬 객체를 반환하면 가비지가 발생하고 동일한 객체를 반환하면 임시로 작동합니다.

MyString MyString::substr(size_t position, size_t length) 
{ 
    if (checkBounds() || length == 0) 
    { 
     return MyString(); 
    } 

    char* tmp = new char[length + 1]; 

    memcpy(tmp, this->s + position, length); 

    tmp[length] = STRING_ESCAPE; 

    MyString result(tmp); 

    delete[] tmp; 
    tmp = nullptr; 

    return result; 
} 

이 메서드를 호출하고 반환 값을 인쇄 할 때 (객체 자체가 아닌 문자 배열 액티비티를 인쇄하고 있습니다), 일련의 사각형으로 수행되는 완전한 쓰레기를받습니다.

그러나 임시 객체 return MyString(tmp)을 반환하면 모든 것이 잘 동작합니다. 처음에는이 문제가 delete [] 연산과 관련되어있는 것으로 의심 되나 주석으로 처리하면 아무런 효과가 없습니다.

MyString::MyString(const char* s) 
{ 
    size_t length = this->strlen(s); 

    this->sLength = length; 

    this->s = new char[length + 1]; 

    for (size_t i = 0; i <= length; ++i) 
    { 
     this->s[i] = *s; 

     ++s; 
    } 
} 

그래서 내 실수는 다음과 같습니다

호출되는 MyString의 생성자는 다음과 같습니다? 고맙습니다!

+0

'STRING_ESCAPE'는 0을위한 멋진 이름입니까? – Casey

+0

왜 'memcpy'를 사용하고 있습니까? 'strcpy'를 사용하십시오. –

+0

#define STRING_ESCAPE '\ 0' – BL9009

답변

0

MyString을 만드는 두 위치에서 substr 함수의 컨텍스트 내에서 만들어집니다. return 문은 사본을 만들어야합니다. 귀하의 복사 생성자가 아마도 당신이 필요로하는 일을하지 않을 것입니다.

substr 함수가 연산자 new로 작성한 MyString에 대한 포인터를 리턴하는 것이 더 간단합니다.

+0

입니다. 표준 복사 생성자가 방금 포인터를 복사했습니다. 문자열 버퍼를 deep-copys하는 사용자 정의 복사본 생성자를 구현했으며 이제는 정상적으로 작동합니다. 힌트를 주셔서 감사합니다! – BL9009

0

실제로 복사 생성자가 누락되었습니다. 이것과 같은 것이 작업을 할 것입니다 :

MyString::MyString(const MyString& other) { 
    size_t length = strlen(other.s);  
    s = new char[length+1]; 
    strcpy(s,other.s); 
    this->sLength = length; 
} 
관련 문제