2012-10-12 90 views
0

例如,我有一個像使用指針初始化C++類是否安全?

myClass(const char* name); 

構造它可像

myClass(const char* name); 
{ 
    someInnerField = name; 
} 

或者我應該值輸入字符串複製到內場?

+3

這實際上取決於您的類應該如何處理指針指向的對象。首先你必須決定誰擁有它。 – juanchopanza

+1

問題是:你想與其他對象分享字符串嗎? – Beachwalker

+0

對象將需要類的實例的所有生命週期,所以我不希望它在課堂以外被修改或發佈。另外,輸入字符串可以在其他地方修改。 –

回答

4

什麼是安全的是:如果該類破壞存儲其成員指向

std::string someInnerField; 
myClass(const std::string& name) : someInnerField(name) 
{ 
} 

你的版本可能會失敗(你仍然可以使用它的類的範圍之外),或者如果記憶被破壞外類(並繼續在內部使用它)。

+0

(對於OP,這種語法稱爲「初始化列表」,以防異常) – jedwards

+0

不會破壞const指針指向的內存違背「const」的含義,意思是指出的區域不會以任何方式修改? –

+0

@SF。不,它不是一個常量指針,而是一個指向const char的指針。 –

0

只要您確定argumet不會是指向可被其他人刪除的內存區域的指針,則是安全的。 但是可以肯定的是,每次處理指針時,您都可以在使用前檢查其有效性,否則可能會導致內存異常。

+0

不幸的是,在這種情況下檢查有效性將不起作用。一些外部函數執行'delete(name); name = NULL「,但是'someInnerField'仍然指向解除分配的區域,而沒有任何關於其有效性的信息。 –

+2

您無法檢查有效性。 –

+0

關於有效性的信息是name == null,所以beffore使用它你可以做,如果(someInnerField!= NULL){做某事}其他{打印錯誤} –

1

這取決於你正在做什麼與類,以及輸入有效的字符串 的類型。一般來說(幾乎總是,實際上), 類應該使用std::string作爲成員,在這種情況下,它完全是 安全。否則,在極少數情況下, 將參數限制爲字符串文字(或其他已知的具有靜態生存期的數據源),在這種情況下,只需保存指針 即可離開。 (但這是非常非常脆弱的,我會避免它,並且 仍然使用std::string。)

0

它不起作用。請使用std :: string,或者如果使用「char *」,則可以使用「strcpy」或「memcpy」函數。