2013-09-26 50 views
1

我有一個叫做myString的簡單類,其中包含一個char*作爲私有成員。無論我做什麼,我似乎都無法刪除它。C++刪除類成員Char *

class myString 
{ 
public: 
    myString():letters("This is a string"){} 
    ~myString() 
    { 
    delete []letters; 
    } 
private: 
    char* letters; 
} 

我已經試過delete lettersdelete[] letters等,但我總是收到一個錯誤。我曾經使用調試器,並且字母總是被初始化爲一個字符串/指向一個字符串,並且調試器總是在刪除行上崩潰。

回答

3

letters指向字符串文字,也就是說myString的每個實例都指向加載的程序可執行文件中的相同數據。

您不能刪除字符串文字,也不需要。

+0

爲什麼我不能/不需要刪除字符串文字?相反,當它超出範圍時,它會被清理乾淨。 – Theopile

+0

@Theopile:字符串文字具有靜態存儲持續時間 - 它們存在直到程序退出。 –

2

首先分配的內存然後嘗試刪除,你試圖刪除一個字符串文字。

class myString 
{ 
public: 
    myString() {letters= new char [25]; /* Copying code */} 
    ~myString() 
    { 
    delete []letters; 
    } 
private: 
    char* letters; 
} 
+0

從閱讀其他評論,我將如何分配「這是一個字符串」,以便它不是一個字符串文字? – Theopile

+0

@theopile可能是這樣的'myString(){letters = new char [25]; strcpy(字母,「這是一個字符串」);}' – P0W

3

請注意:

  • 指針永遠不會自動分配。
  • 「Hello Word」的類型是const char [11](轉換是const char *而不是char *)
  • 將const char *分配給char *是不好的。
  • 如果該指針從之前的new/new []獲取值,則只能刪除/刪除[]指針。
+0

什麼是短信賦值字母(「這是一個字符串」)在做什麼?它是否創建一個字符串文字並將字母指向T的地址?我將如何使用短手指派一個動態字符數組,即使他們都會說「這是一個字符串」? – Theopile

+0

@Theopile在爲陣列分配內存後,使用memcopy或strcpy將數據移動到正確的位置。既然你使用C++爲什麼不是std :: string? – stonemetal

+0

@Theopile char * = const char *(這是「這是一個字符串」)在C++中被棄用。 –

0

您似乎想要有一個副本的字符串,也許您可​​以稍後修改它。 C++不會爲你創建字符串緩衝區,你必須自己做。

myString() 
{ 
    letters = new char[MAX_STRING_LEN]; 
    strcpy(letters, "This is a string"); 
} 

當然這將是更好地使用std::string,而不是一個動態分配的字符緩衝區,但我假設你有你的理由。