2011-12-23 1 views
2

내 자신의 문자열 클래스를 작성하려고합니다. 그래서 더 많은 것을 배울 수 있습니다. 그러는 동안 char 데이터가 삭제되는 방식에 문제가 있음을 발견했습니다. 프로그램은 문자열의 소멸자가 호출됩니다 닫을 때이 데이터숯을 지우는 중 메모리 예외가 발생하는 이유는 무엇입니까?

#include <string.h> 

template<typename T> 
class String 
{ 
protected: 
    T* mData; 

public: 
    String(const T* data); 
    ~String(); 
}; 

template<typename T> 
String<T>::String(const T* data) 
{ 
    if(data != NULL) 
    { 
     mData = new T[strlen(data)]; 
     strcpy(mData, data); 
    } 
} 

template<typename T> 
String<T>::~String() 
{ 
    if(mData != NULL) 
    { 
     delete [] mData; 
     mData = 0; 
    } 
} 

int main(void) 
{ 
    String<char> Test("Test"); 

    return(0); 
} 
당신은 하나 개의 항목 너무 적은, strcpy를 복사 NUL 종단 바이트를 할당하는
+1

삭제하기 전에 NULL을 테스트 할 필요가 없습니다 (또는 값을 0으로 설정). –

+1

세 규칙을 따라야합니다. 그렇지 않으면 첫 번째 복사본 후에 충돌이 발생합니다. –

+0

당신이 맞습니다, 나는 3 가지 규칙을 위반했습니다. (간단한 테스트 케이스를 원했습니다) – judeclarke

답변

5
mData = new T[strlen(data)]; 
     strcpy(mData, data); 

삭제에 힙 오류가있을뿐만 아니라 것 문자열

+0

그건 정확히 말하면 완전히 잊었습니다. 도와 주셔서 감사합니다. – judeclarke

0

strcp 대신 "memcpy"및 "memset"함수를 사용해야합니다. Y는 :

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

+0

왜 이렇게됩니까? – judeclarke

+0

'memcpy'함수를 사용하면 메모리 블록을 빠르게 처리 할 수 ​​있습니다. 또한 'strcpy'는 안전하지 못한 경우 오버플로가 발생할 수 있으므로 보안 상 'strlcpy'함수가 있습니다. 메모리 블록 기능을 사용하면 전체 메모리를 제어 할 수 있습니다. 개인적으로 나는 char 형을위한 두 개의 문자열 clasess 하나와 wchar_t 형을위한 다른 둘 모두를 선호한다. 이것은 템플릿 (generic)을 사용하는 것보다 동일한 일반 추상 클래스 (인터페이스)를 상속받는 것이다. – ArBR

0

당신은 당신의 생성자에서 예외를 throw new 연산자에 대해주의해야합니다. 이런 일이 발생하면 데이터 포인터를 nullptr로 초기화하고 otherwize로 소멸자가 호출되고 임의의 임의의 주소를 삭제하려고 시도해야합니다.

#include <cstring> 

template<typename T> 
class string { 
    protected: 
     T * data_; 
    public: 
     string(T const * data); 
     ~string(); 
}; 

template<typename T> 
string<T>::string(T const * data) 
try { 
    if(!data) data_ = 0; 
    else { 
     data_ = new T[std::strlen(data) + 1]; 
     std::strcpy(data_, data); 
    } 
} catch(...) { 
    data_ = 0; 
} 

template<typename T> 
string<T>::~string() { 
    delete[] data_; 
} 

int main() { 
    string<char> test("test"); 
    return 0; 
} 
관련 문제