2014-07-08 2 views
-5

나는 내 자신의 문자열 클래스를 만들고 있지만 strlen()을 사용하는 동안 문자열의 문자를 읽는 데 문제가 있습니다.내 str 클래스의 오류

/****str.h****/ 

class str 
{ 
private: 
    char *m_ptr; 
    unsigned int m_size; 
    //unsigned int m_capacity; 
public: 
    str(); 
    str (const char *); 
    str (const str &); 
    ~str(){if (m_size != 0) delete [] m_ptr;}; 
    char *data() {return m_ptr;}; 

    //Sobrecarga de operadors. 
    str operator=(str); 
    friend std::ostream& operator<<(std::ostream &, str); 
}; 

C 문자열 상수로 초기화 된 생성자를 사용하여 오류가 발생했습니다.

/****str.cpp****/ 

//Default constructor. 
str :: str() 
{ 
    m_ptr = new char [1]; 
    m_ptr[0] = '\0'; 
    m_size = 0; 
    //m_capacity = 10; 
} 

str :: str(const char *sm_ptr) 
{ 
    m_size = strlen(sm_ptr); //HERE IS WHERE THE ERROR OCCURS. 
    m_ptr = new char[m_size + 1]; 
    strcpy(m_ptr, sm_ptr); //Copies the C string pointed by source into the array pointed by destination, including the terminating null character 
} 
//Copy constructor. 
str :: str(const str &right) 
{ 
    m_ptr = new char [right.m_size]; 
    strcpy (m_ptr, right.m_ptr); 
    m_size = right.m_size; 
} 

str str::operator=(str right) 
{ 
    if (m_size != 0) delete [] m_ptr; 
    m_ptr = new char [right.m_size + 1]; 
    strcpy(m_ptr, right.m_ptr); 
    m_size = right.m_size; 
    return *this; 
} 

std::ostream &operator<<(std::ostream &strm, str obj) 
{ 
    strm << obj.m_ptr; 
    return strm; 
} 

0x0053fdd0 {m_ptr = 0xcccccccc m_size = 3,435,973,836} STR *

+3

스택 오버플로에 오신 것을 환영합니다. [Stack Overflow : How to ask] (http://stackoverflow.com/questions/how-to-ask) 및 [Jon Skeet의 질문 체크리스트] (http://msmvps.com/blogs/jon_skeet/archive/2012)를 읽어보십시오. /11/24/stack-overflow-question-checklist.aspx) 유용한 유용한 답변을 얻을 수있는 좋은 질문을하는 방법을 찾으십시오. –

+0

_ '특히 오류가있는 오류가 발생했습니다 ...'? 질문을 편집하십시오. –

답변

1

const str& operator=(const str&); 

임시 객체의 생성을 제거하는 것입니다

str& operator=(str&); 

하거나 할당 연산자 선언을 변경 . 인수를 함수에 전달하는 방법에 대한 자세한 내용은 this article을 확인하십시오.

다른 몇 가지 문제가 있습니다. 예를 들어 기본 생성자에서 메모리를 할당하지만 크기를 설정하지 않으므로 해제되지 않습니다. 또한 복사 생성자와 대입 연산자에서 자체 할당을 확인하는 것이 좋습니다.