2015-09-28 17 views
1

當我創建一個類,包含一個指針,並在自動存儲中創建一個對象時,我應該在類中包含析構函數嗎? (是否有必要以釋放空間在存儲器?) 實施例:應該使用自動存儲的指針包含析構函數嗎?

class Node{ 
    char *Name; 
    int age; 
    Node(char *n = 0, int a = 0) { 
     name = strdup(n); 
     age = a; 
    } 
    ~Node(){ 
     if (name != 0) 
      delete(name); 
    } 
} 

Node node1("Roger",20); 
+4

在這種情況下,你應該使用'std :: string',然後不需要任何指針。 – crashmstr

+2

爲了可讀性,我建議用'NULL'或'nullptr'替換那些'0',並保持與約定一致。 – user4581301

+0

當您使用低級資源分配(如malloc或new)時,編寫析構函數。但是你幾乎從不使用。特別是,如果你需要一個字符串,使用'std :: string'。 –

回答

1

對,這是強制性的,以避免內存泄漏。無論你是使用課堂還是別的什麼都沒關係。 strdup說的很重要。但是,您不能使用delete,而應使用freestrdup中的內存使用malloc創建,而不是new

http://pubs.opengroup.org/onlinepubs/009695399/functions/strdup.html

的strdup - 複製一個字符串

返回的指針可以傳遞給免費()。如果無法創建新字符串,則返回空指針 。

P.S.千萬不要錯過您的char *n聲明中的const,否則調用者可能會期望字符串被修改,並且不會在沒有警告的情況下傳遞簡單字符串文字。

P.S.2:優選使用nullptr而不是0。這已在SO上多次討論過。

4

是否需要釋放內存中的空間?

是的,避免內存泄漏至關重要。

無論如何,在您的示例中,您必須使用free(name);,因爲strdup()是純C函數,並使用malloc()函數爲返回的副本分配內存。


另外,你應該避免在C++中自己管理原始指針。請使用smart pointersstandard C++ containers,或者針對您的特定情況簡單地使用std::string

原始指針不適合,分別使Rule of Three (5/zero)複雜化。

如果您從C-style界面分配了某些東西,則您始終可以使用智能指針並提供實際使用適當的free()調用的自定義刪除功能。

+0

@downvoters謹慎解釋我的答案在這裏有什麼問題嗎?我看不到任何錯誤?我想這只是一個_tactical的原因_或什麼? –

2

如果你的類具有指向,而不是使用原始char *和手動內存管理到與new分配\ new[] \ malloc()那麼你需要實現Rule of Three

也就是說內存,指針,使用改爲std::string。如果您需要其他功能,但它完全自行管理的容器,仍然可以獲得const char*。有了它,你不需要提供一個複製構造函數或析構函數,因爲編譯器提供的默認函數將起作用。

相關問題