2015-09-04 46 views
-1

我有這個類如何深拷貝無符號長

typedef unsigned long Item; 
class Stack 
{ 
private: 
    enum { MAX = 10} ; 
    Item * pitems;  
    int size;   
    int top;   
public: 
    Stack(int n = 10); 
    Stack(const Stack & st); 
}; 

如何我做的Item深拷貝? 這是正確的嗎?

pitems = st.pitems; 

Stack::Stack(const Stack & st){ 
size = st.size; 
pitems = new Item[size + 1]; 
pitems = st.pitems; 
top = st.top;} 
+0

是否要複製項目或指針?目前,你似乎只是設置指針。國際海事組織你會有內存泄漏。 – Blacktempel

+0

我想複製這些項目。 – Knot

回答

3

循環做出新的數組和複製它們,其他類的不是指針。

Stack::Stack(const Stack &st) 
{ 
    this->size  = st.size; 
    this->top  = st.top; 
    this->pitems = new Item[this->size + 1]; 
    for (auto i = 0; i < this->size; ++i) 
    { 
     pitems[i] = st.pitems[i]; 
    } 
} 

正如之前的評論所述,您目前有內存泄漏。

2

不,您需要遍歷舊數組中的每個項目併爲新數組創建新副本。

for(int i = 0; i != size; ++i) 
{ 
    pitems[i] = st.pitems[i]; //Assuming you have an equals operator for Item 
} 

,絕對不做pitems = st.pitems;,因爲這泄漏你通過他們用new Item[size + 1]