C++中的Malloc函数

Moh*_*nde 6 c++ malloc new-operator

我正在从C转换到C++.在C++中,malloc函数有用吗?或者我可以使用"new"关键字声明它.例如:

class Node
{
    ...
}
...
Node *node1 = malloc(sizeof(Node));        //malloc
Node *node2 = new Node;                    //new
Run Code Online (Sandbox Code Playgroud)

我应该使用哪一个?

Kri*_*son 21

使用new.您不应该malloc在C++程序中使用,除非它与某些C代码交互,或者您有某种理由以特殊方式管理内存.

你的例子node = malloc(sizeof(Node))是一个坏主意,因为Node(如果有的话)的构造函数不会被调用,后续的delete node;结果将是未定义的.

如果你需要一个字节缓冲区而不是一个对象,你通常会想要做这样的事情:

char *buffer = new char[1024];
Run Code Online (Sandbox Code Playgroud)

或者,最好是这样的事情:

std::vector<char> buffer(1024);
Run Code Online (Sandbox Code Playgroud)

注意,对于第二个例子(使用std::vector<>),不需要delete对象; 当它超出范围时,它的内存将自动释放.你应该努力避免使用newmalloc在C++程序中,而是使用自动管理自己内存的对象.

  • 如果您通过自己的`operator :: new`进行自定义内存分配,也可以使用`malloc`. (7认同)

CB *_*ley 9

malloc()C++中的直接等价物operator new()也分配了原始内存,但在大多数情况下,new表达式就是你想要的.甲new表达二者分配原始存储器的适当量和在该存储器位置初始化一个对象,一个键入正确指针返回给新的对象.

在您的情况下,new Node是正确的,因为它分配内存并初始化一个新Node对象.简单地调用malloc并将结果转换为指针Node将无法正确构造Node对象.如果Node不是POD结构(例如,当它或它的一个子对象具有应该被调用的构造函数时),这是至关重要的.

你应该避免在不需要的地方进行动态分配; 在需要的地方,通常最好使用动态分配的对象的地址初始化某种智能指针,这样就不可能"忘记" delete对象.