2011-05-01 79 views

回答

3

是的,你想用new

shared_ptr<Node> node(new Node); 

你可以找到的shared_ptr在boost,C++ 0x中和TR1。它會爲你處理重新分配,確保你沒有內存泄漏。如果你使用boost,你想包含並使用boost :: shared_ptr。

+0

謝謝,我應該包含哪些頭文件?如果你使用C++ 0x(std :: shared_ptr ),如果你使用boost(boost :: shared_ptr ),那麼可以使用 – 2011-05-01 05:08:02

+0

。 – Lstor 2011-05-01 05:13:32

+0

@唐倫:TR1也有shared_ptr。 ''和':: std :: tr1 :: shared_ptr'。 TR1實際上在很多編譯器中都有出貨,並且得到了全面的支持,而C++ 0x現在在大多數編譯器中通常被認爲是「實驗性的」。 – Omnifarious 2011-05-01 21:47:29

4
需要

使用新的,沒有投:

Node* node = new Node; 

完成後,使用刪除,而不是隨意解除分配內存:

delete node; 

不過,建議您使用的shared_ptr:

#include <memory> 

std::shared_ptr<Node> node(new Node); 

使用shared_ptr,不需要顯式刪除結構實例。當節點超出作用域時,它將被刪除(如果它沒有被共享,否則當最後一個指向它的shared_ptr超出作用域時它將被刪除)。

+1

要添加到:記住'delete',不'free',必須用來釋放與'new'分配的內存。 – 2011-05-01 05:06:18

+0

好點 - 更新。 – 2011-05-01 05:11:29

3

其更好地使用new因爲malloc不叫,所以Node不會被「建造」如果你使用malloc只分配所需的存儲構造。

另一方面,new首先分配內存,然後調用更好的構造函數。

編輯:

如果使用malloc,你可能會遇到這樣的問題:(必看)

Why do I get a segmentation fault when I am trying to insert into a tree*

+0

如果代碼來自C,它可能沒有構造函數。 – 2011-05-01 05:08:05

+0

@Chris:如果它的C,那麼你也沒有'new'。 – Nawaz 2011-05-01 05:09:17

+1

代碼是__ from_C.OP可能還沒有發現需要有'Node'的構造函數。並非所有C++中的'struct'都有構造函數。 – 2011-05-01 05:11:24

0

Node *node = new Node;

這應該在這裏有確切的效果相同。

2

在C++中,您應該幾乎總是使用new而不是malloc,特別是在創建非POD對象時。因爲new將啓用該類的相應構造函數,而malloc不會。如果沒有爲新創建的對象調用構造函數,你會得到一個指向一塊垃圾的指針。

考慮下面的例子:

class MyClass 
{ 
public: 
    vector<int> m_array; 
    void insert(); 
}; 
void check::insert() 
{ 
    MyClass *root = (MyClass*)malloc(sizeof(MyClass)); 

        -- This will crash your program because internal vector object 
        v -- has not been initialized yet 
    root->m_array.push_back(0); 
}