2011-03-27 9 views
0

이 생성자에서 새 문자열 배열을 만들 때 디버거가 나에게 '나쁜 ptr'을 주지만 내 오버로드 연산자 메서드가 새로운 MyString 객체를 생성 할 때만 ... 혼란 스럽습니다. 여기 <bad ptr> 오버로드 + 연산자

여기
MyString::MyString() 
{ 
    stringSize = 0; 
    stringCap = 16; 
    stringArray = new char[stringCap + 1]; 
    stringArray[0] = '\0'; 
} 

내 오버로드 연산자 방법 여기

MyString operator+(const char* leftOp, const MyString& rightOp) 
{ 
    MyString result; // new object used to store result 
    result.stringSize = strlen(leftOp) + rightOp.stringSize; 
    // if the string does not fit in the array 
    if(result.stringSize > result.stringCap) 
    { 
     delete[] result.stringArray; 
     result.stringCap = (result.stringSize + 15) & ~15; 
     result.stringArray = new char[result.stringCap + 1]; 
    } 
    strcpy(result.stringArray, leftOp); 
    strcat(result.stringArray, rightOp.stringArray); 
    return result; 
    } 

내 생성자 디버거가 너무

MyString::MyString(const MyString& s) 
{ 
    stringSize = s.stringSize; 
    stringCap = s.stringCap; 
    //stringArray[stringCap + 1]; 
    stringArray = new char[stringCap + 1]; 
    stringArray = s.stringArray; 
} 
+2

컴파일러는 정확히 무엇을 말합니까? –

+0

복사 생성자에서 'stringArray = s.stringArray;'가 잘못되었습니다. 대신에'strcpy'를 사용하십시오. 내 대답에 편집을 참조하십시오! – Nawaz

답변

1

코드 스 니펫에서 아무 것도 보이지 않으므로 여섯 번째 감각은 복사 생성자를 작성하지 않았으며 컴파일러에서 생성 된 기본 코드로 작업하고 있거나 가능하면 stringArray이 널로 끝나지 않았 음을 알려줍니다. 끈!

편집 :

당신의 복사 생성자에서

, 이것은 잘못된 것입니다 : 대신

stringArray = s.stringArray; //wrong! 

사용 strcpy :

strcpy(stringArray, s.stringArray); //correct! 

하는 모든 문자열이 null이 종료되어 있는지 확인합니다!

+0

복사 생성자를 작성했지만 디버거를 사용할 때 복사 생성자에 도달하지 않습니다. – bluetickk

+0

@bluetickk : 잘못 작성했을 수 있습니다. 우리에게 코드를 보여줘! – Nawaz

+0

복사 생성자를 사용하여 원본 게시물을 편집했습니다. – bluetickk

3

음을 얻는다 결코 내 복사 생성자은,이다, 때 이 메소드는 "결과"를 복사하고 원본은 소멸됩니다. 소멸자가 배열을 삭제하고 새 복사본에 유효한 새 배열이 포함되도록하는 스마트 복사본 생성자가없는 경우 문제가 발생합니다.

하지만 컴파일러은 나쁜 포인터에 대해 말합니다 - 어디에서? 어떤 라인?

+0

이 줄을 읽 자마자 디버거가 나쁜 ptr을 말합니다 stringArray = new char [stringCap + 1]; – bluetickk

+0

@bluetickk : 더 많은 코드를 보여주세요! – Nawaz

+0

복사 생성자로 내 게시물을 편집했습니다. – bluetickk