2013-04-10 55 views
1

我有這是一個指針成員的結構/類,比方說刪除指針是一個公共類成員

struct myStruc 
{ 
    int* m_p; 
} 

1.問:我應該在哪裏刪除指針?在析構函數中?

myStruct::~myStruct() 
{ 
    delete m_p; 
} 

2.問題:如果指針被分配給一個指針數組,例如

myStruct mS; 
mS.m_p = new int[3]; 

有一個很好的方式(無dynamic_cast的或的try-catch)到現在,如果我要做deletedelete[]

+0

A /方法是在構造函數中分配內存並在析構函數中釋放它。 – 2013-04-10 14:32:26

+0

你能告訴更多關於用例的信息嗎? myStruc的目的是什麼?誰在設置m_p? m_p指向什麼?誰決定並知道這一點? – 2013-04-10 14:40:42

+1

[第20項:避免在公共界面中的數據成員。](http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876) – 2013-04-10 14:54:50

回答

3

你不應該讓「用戶」弄亂你的數據結構中的指針。使指針保密並使用get/set函數來訪問它。

所以:

struct myStruc 
{ 
    private: 
    int* m_p; 
    public: 
    int* ptr() { return m_p; } 
    void allocate(int n) { m_p = new int[n]; 
    myStruc() : m_p(0) {}; 
    ~myStruc() { delete [] m_p; } 
}; 

編輯:上面的類是不完整的,它顯示的概念。對於完整的類,您需要一個拷貝構造函數和一個賦值運算符,並可能從allocate函數中「記住」n

現在你不必擔心你是否用[]分配,因爲它是一致的。

當然,您可以使用std::vector來代替,而無需額外的努力。

+0

你的代碼有問題。它不遵循三的規則。這是一場等待發生的災難。 – 2013-04-10 14:52:03

+0

@AlokSave:你指的是什麼?缺少複製構造函數? – ezdazuzena 2013-04-10 15:03:09

+1

@ezdazuzena:是的。在這種情況下,無論何時複製對象,都會使用隱式生成的複製構造函數,並且不會對數據成員進行深層複製。這基本上意味着你最終得到兩個引用同一個動態分配內存的對象,一旦它們超出了範圍,它就會釋放內存並給你一個懸掛指針和UB。可以認爲該類不可複製或可分配,但因爲複製構造函數和賦值運算符都應聲明爲「private」,因此不應提供任何定義。 – 2013-04-10 15:06:58

0
  1. 理想情況下在析構函數。但請按照Rule of Three
  2. 您應該使用delete[]new/new[]應分別使用delete/delte[]
+0

關於2 .:我現在怎麼使用新的int [3]?如果執行了'mS.m_p = new int();'會怎麼樣?那麼delete []'會失敗。 – ezdazuzena 2013-04-10 14:34:03

+0

爲什麼在析構函數中理想?結構怎麼知道它是否應該刪除指針,或者是否調用delete或delete []'? – juanchopanza 2013-04-10 14:38:04

+0

@juanchopanza從我的角度來看,raw指針通常會在析構函數中返回它的資源。我在2中回答了您的評論的刪除部分。 – Mahesh 2013-04-10 14:41:03

2

理想情況下,您根本不應該使用原始指針成員。你有兩個更好的選擇:

  1. 使用std::vector
  2. 使用智能指針委員兼choose the right one as per your usage semantic

如果您不能使用智能指針,必須使用的RAW指針:如果您分配使用new然後用delete,如果你使用new [],那麼你需要使用delete []指針

  • 。應該沒有不匹配。
  • 每當此動態分配成員的生命週期結束時,您需要致電deletedelete []。假設這個成員的生命週期與你的類的生命週期相同,它將在析構函數中。
  • 重要的是你應該遵循The Rule of Three
+0

我沒有使用提升。 – ezdazuzena 2013-04-10 14:35:45

+1

@ezdazuzena:你不需要提升。 'std :: vector'是自C++ 03以來的語言的一部分,而如果您使用的是C++ 11,則您可以選擇多種智能指針。 – 2013-04-10 14:43:56

+0

我同意這個答案。如果我們假設這個類已經被正確地定義爲'struct',那麼說這個指針不應該是public。 – Gorpik 2013-04-10 15:29:24