我應該在C++中爲C中的以下代碼做些什麼?我應該在C++中爲C中的代碼做些什麼?
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
我應該使用「新」嗎? 感謝
我應該在C++中爲C中的以下代碼做些什麼?我應該在C++中爲C中的代碼做些什麼?
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
我應該使用「新」嗎? 感謝
是的,你想用new
:
shared_ptr<Node> node(new Node);
你可以找到的shared_ptr在boost,C++ 0x中和TR1。它會爲你處理重新分配,確保你沒有內存泄漏。如果你使用boost,你想包含並使用boost :: shared_ptr。
使用新的,沒有投:
Node* node = new Node;
完成後,使用刪除,而不是隨意解除分配內存:
delete node;
不過,建議您使用的shared_ptr:
#include <memory>
std::shared_ptr<Node> node(new Node);
使用shared_ptr,不需要顯式刪除結構實例。當節點超出作用域時,它將被刪除(如果它沒有被共享,否則當最後一個指向它的shared_ptr超出作用域時它將被刪除)。
要添加到:記住'delete',不'free',必須用來釋放與'new'分配的內存。 – 2011-05-01 05:06:18
好點 - 更新。 – 2011-05-01 05:11:29
其更好地使用new
因爲malloc
不叫,所以Node
不會被「建造」如果你使用malloc
只分配所需的存儲構造。
另一方面,new
首先分配內存,然後調用更好的構造函數。
編輯:
如果使用malloc
,你可能會遇到這樣的問題:(必看)
Why do I get a segmentation fault when I am trying to insert into a tree*
如果代碼來自C,它可能沒有構造函數。 – 2011-05-01 05:08:05
@Chris:如果它的C,那麼你也沒有'new'。 – Nawaz 2011-05-01 05:09:17
代碼是__ from_C.OP可能還沒有發現需要有'Node'的構造函數。並非所有C++中的'struct'都有構造函數。 – 2011-05-01 05:11:24
Node *node = new Node;
這應該在這裏有確切的效果相同。
在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);
}
謝謝,我應該包含哪些頭文件?如果你使用C++ 0x(std :: shared_ptr),如果你使用boost(boost :: shared_ptr ),那麼可以使用 –
2011-05-01 05:08:02
@唐倫:TR1也有shared_ptr。 ''和':: std :: tr1 :: shared_ptr'。 TR1實際上在很多編譯器中都有出貨,並且得到了全面的支持,而C++ 0x現在在大多數編譯器中通常被認爲是「實驗性的」。 –
Omnifarious
2011-05-01 21:47:29