2013-03-20 4 views
0
template<> 
class CalcHashClass<const char*> { 
public: 
    CalcHashClass(const char* v) { 
     _v = new char[strlen(v) + 1]; 
     strcpy(_v,v); 
    } 

    ~CalcHashClass() { 
     delete [] _v; 
    } 

    int hashCode() { 
     printf("This is 'template <> class CalcHashClass<const char*>'.\n"); 
     int len = strlen(_v); 
     int code = 0; 
     for (int i = 0; i < len; ++i) 
      code += (int)_v[i]; 
     return code; 
    } 

private: 
    char* _v; 
}; 

위 코드의 경우 무엇이 delete [] _v;입니까? 제 생각에 _v는 포인터입니다. 삭제하려면 delet _v을 사용해야합니다. 맞습니까? []의 의미는 무엇입니까?'[[_]; 삭제 하시겠습니까?' 평균?

+1

'_v'는 배열임을 의미합니다. 'new' 문에서'['와']'를 볼 수 있습니다. –

+0

원시 배열과 멤버 변수에 대해 알지 못했을 때 템플릿 전문화를 어떻게 얻었는지 잘 모르겠습니다. – dchhetri

답변

4

delete x은 변수 x 만 삭제하는 반면 [ ]은 배열이 할당되었음을 메모리 관리자에게 알립니다. delete[] x은 할당 된 배열을 삭제합니다.

+0

나는이 대답을 좋아하고, 간단하고 이해하기 쉽다. 감사! –

1

delete[]을 "배열 삭제 연산자"라고합니다. new[]을 사용하여 할당 된 배열을 삭제합니다.

어레이 delete을 비 어레이 new으로 사용하거나 그 반대로 사용할 수 없다는 점에 유의해야합니다. 자세한 내용은

, 당신의 클래스가 Rule of Three 위반, 측면 참고로

Why do we even need the "delete[]" operator?를 참조하십시오. 복사 생성자 및 복사 할당 연산자를 제공 (또는 비활성화)해야합니다.

1

new []을 사용하여 배열을 할당 할 때 new []을 사용하여 할당 된 메모리가 delete 인 경우 delete []을 사용해야 할 때 정의되지 않은 동작이 발생합니다.

_v = new char[strlen(v) + 1]; 

따라서 호출 delete []에를 나중에 소멸자 : 코드에서 당신이 당신의 생성자에서 new []를 사용하여 할당된다 기록했다. 오브젝트 _v 점이 할당 된 해당 방법에

3

룩은 :

_v = new char[strlen(v) + 1]; 

그것은 동적 char 배열을 할당하는 것을 의미하는 new char[...] 구문을 이용한다. 동적으로 할당 된 배열을 삭제하려면 delete[]을 사용해야합니다.

_v_v 형식의 배열을 가리키고 있다고 컴파일러에서 알 수 없기 때문에 이러한 이유가 필요합니다. _v은 단지 char*이므로, 하나의 동적 할당시이를 가리킬 수있는 이유는 없습니다 char. 따라서 delete[]은 정확히 얼마나 많은 공간이 여기에 할당되었는지 알아 내고 그 전부를 할당 해제해야한다는 것을 컴파일러에게 알려줍니다.

관련 문제