2014-09-26 237 views
0

我正在構建一個String類,我想知道如果在構造函數和複製構造函數中我應該複製字符或只是指向相同的內存地址作爲傳遞的char */char複製的String對象的* 這是我寫到目前爲止:字符串類的構造函數和複製構造函數

String::String(const char* pch) 
{ 
    str = const_cast<char*>(pch); 
    length = getLen(); 
} 

String::String(const String& that) 
{ 
    length = that.length; 
    str = new char[length]; 
    for (unsigned int i = 0; i < length; i++) 
    { 
     str[i] = that.str[i]; 
    } 
} 

在我只是指向相同的地址爲const char *構造函數中,我應該把它作爲或每個字符複製到新分配的內存塊?如果我要改變字符串,我會分配一個新的內存塊,所以char *是const不是什麼大問題(我認爲)。在複製構造函數中,我將每個字符複製到新分配的內存空間,但我不確定是否有必要,因爲如果稍後更改字符串,將爲正在更改的對象分配新的內存塊,而使其他對象相同指針不變。想要聽取您的意見。 「str」是char *類型。

+1

(1)爲什麼不使用'std :: string'? (2)總是複製;字符串應該是一個「值」類。 (3)你不知道誰擁有傳入的指針,也不知道它指向的字符串何時可以被釋放。這是**不安全**保留指針的副本! – cdhowie 2014-09-26 15:31:36

+0

@cdhowie家庭作業這就是爲什麼:)謝謝沒有想到的情況下,內存將被釋放。 – 2014-09-26 15:39:09

+0

@cdhowie忘了問,在構造函數中傳遞的參數是const char *,如果我要創建const char *我不能釋放它,因爲它沒有使用內存分配函數創建,所以它不會被釋放否?所以它可以保持原樣(談論構造函數) – 2014-09-26 15:42:56

回答

0

由於您無法控制其指針傳遞給構造函數的字符串的生存期,因此依賴它是不安全的。製作字符串的副本。

此外,由於您不知道傳遞的指針是否爲const,因此如果這樣拋出常量可能會導致未定義的行爲。