2013-03-20 96 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,我說得對嗎? []是什麼意思?'delete [] _v''是什麼意思?

+1

這意味着'_v'是一個數組。你也可以在'new'語句中看到'['和']'。 – 2013-03-20 14:40:21

+0

我不確定如果你還沒有了解原始數組和成員變量,你甚至不知道如何進行模板專業化。 – dchhetri 2013-03-20 14:43:15

回答

4

delete x將僅刪除變量x 而[ ]則向內存管理器指示已分配數組。 delete[] x將刪除分配的數組。

+0

我喜歡這個答案,簡單易懂。謝謝! – 2013-03-20 14:47:21

1

delete[]被稱爲「數組刪除運算符」。它刪除使用new[]分配的數組。

重要的是要注意,不允許將數組delete與非數組new一起使用,反之亦然。

欲瞭解更多信息,請參閱Why do we even need the "delete[]" operator?

作爲一個側面說明,你的類違反了Rule of Three。您應該提供(或禁用)複製構造函數和複製賦值運算符。

1

當你有一個數組分配使用new []你需要的,如果你只使用delete內存分配使用new []你將有不確定的操作使用delete []。在代碼貼出你在你的構造函數使用這裏分配new []:後來在析構函數

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

因此呼籲delete []

3

怎麼看待對象,以被分配_v點:

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

它使用new char[...]語法,這意味着它是動態分配的char陣列。要銷燬動態分配的陣列,您需要使用delete[]

這是必要的原因是因爲編譯器不能指出_v單獨指向一個類型爲_v的數組。由於_v只是一個char*,所以沒有理由不能將它指向動態分配的char。所以delete[]告訴編譯器,它需要找出在這裏分配了多少空間,然後釋放所有的空間。