对于C++中的代码,我应该做些什么? < C++ >下面的代码在C?< /P >中应该做什么? struct Node* node = (struct Node*)malloc(sizeof(struct Node));
我应该用新的吗?对于C++中的代码,我应该做些什么? < C++ >下面的代码在C?< /P >中应该做什么? struct Node* node = (struct Node*)malloc(sizeof(struct Node));,c++,c,C++,C,我应该用新的吗? 谢谢使用新的,不需要演员阵容: Node* node = new Node; 完成后,请使用“删除”而不是“释放”来释放内存: delete node; 但是,建议使用共享ptr: #include <memory> std::shared_ptr<Node> node(new Node); 使用shared_ptr,无需显式删除结构实例。当节点超出作用域时,如果它没有被共享,它将被删除,否则当指向它的最后一个共享\u ptr超出作用域时,它将被
谢谢使用新的,不需要演员阵容:
Node* node = new Node;
完成后,请使用“删除”而不是“释放”来释放内存:
delete node;
但是,建议使用共享ptr:
#include <memory>
std::shared_ptr<Node> node(new Node);
使用shared_ptr,无需显式删除结构实例。当节点超出作用域时,如果它没有被共享,它将被删除,否则当指向它的最后一个共享\u ptr超出作用域时,它将被删除。最好使用new,因为malloc不调用构造函数,所以如果使用只分配所需内存的malloc,则不会构造节点
另一方面,new首先分配内存,然后调用更好的构造函数
编辑:
如果使用malloc,可能会遇到以下问题:必须查看
节点*节点=新节点
这在这里应该具有完全相同的效果。是的,您想使用新的:
您可以在C++0x和TR1中找到共享_ptr。它将为您处理释放,确保您没有内存泄漏。如果使用Boost,则希望包含和使用Booo::SyddypTr.< /P>,在C++中,几乎总是使用新的而不是MALLC,尤其是在创建非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);
}
要补充的是:请记住,必须使用delete而不是free来释放分配给new的内存。如果代码来自C,则可能没有构造函数。@克里斯:如果是C,则也没有new。代码来自C。OP可能还没有发现需要为Node创建构造函数。并非C++中的所有结构都有构造函数。克里斯:我不确定。但据我所知,C++中的所有结构都有构造函数,甚至是POD。POD没有用户定义的构造函数。如果使用C++0x std::shared\u ptr,如果使用boost boost::shared\u ptr。@Don Lun:TR1也有shared\u ptr。and::std::tr1::shared\u ptr。事实上,TR1在许多编译器中都有提供,并且完全受支持,而C++0x现在在大多数编译器中通常被认为是“实验性的”。
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);
}