2017-08-11 28 views
1

我是C++中的新手。面試官說,在一個函數中創建一個對象是不好的做法。是這樣嗎?爲什麼在C++的函數中創建一個對象是一種不好的做法?

#include <iostream.h> 

class linkedlist { 
    int value; 
    linkedlist *next; 
    static linkedlist *p=NULL; 

    void insert(int data) { 
     linkedlist node; 
     node.value=data; 
     node.next=NULL; 

     if(p==NULL) 
      p=node; 
     else { 
      p->next=node; 
      p=p->next; 
     } 
    } 
} 

int main() { 
    linkedlist h; 
    h.insert(10); 
    h.insert(20); 
    return 0; 
} 
+2

整個代碼都是不錯的做法。從'#include '開始。 – LogicStuff

+2

@LogicStuff我無法理解你的評論。 – user7937993

+1

@LogicStuff有什麼可以downvote?你可以等待。我清楚地說我是新手 – user7937993

回答

5

問題是「終生」;您創建的節點只存在於函數的堆棧框架中,並且函數終止時,它的內存將被回收。然而,靜態指針p仍然會將其鏈接起來,當某人稍後訪問鏈接列表時,這會導致「未定義的行爲」。

使用本地對象一般來說並不壞,如果你期望它們在函數結束時能夠存活,這隻會是壞事,因爲它們不會。

您應該通過使用new將免費商店中的對象分配給長生命的對象。

+0

謝謝。然後我的插入更改爲下面的結構權利? void insert(){ linkedlist * node = new linkedlist; node-> value = data; node-> next = NULL; if(p == NULL)p = node; else { p-> next = node; p = p-> next; } } – user7937993

+0

@ user7937993是的,這可以讓你開始,但請注意,你只能使用該代碼深入列出2個節點。如果你想創建一個任意長度的列表,你將需要一個循環來查找列表的末尾。 – user4581301

+0

@ user7937993:該代碼適用於一個節點,但不適用於多個節點(提示:用新節點地址覆蓋'p-> next' ......誰告訴你'p-> next'是空值?)。處理簡單鏈接列表節點插入的簡單方法是將新節點放置在列表的開頭,並且代碼根本不需要「if」。 – 6502

相關問題