malloc和new的区别,new和operator new的区别,分配器介绍
发布网友
发布时间:2022-04-25 15:46
我来回答
共1个回答
热心网友
时间:2023-10-14 08:14
首先先解释几个概念:
分配空间和初始化:分配空间只是在内存上划定一片区域作为已分配空间使用,但是该空间上的值是未知的;而初始化则是对空间进行了赋值过程,也就是已经可以正常使用了。
malloc和new:
从本质上来说,malloc只是分配空间,不进行任何初始化,内存空间上的值是未知的,而new则是分配完空间,同时在该分配完的控件上进行初始化,也就是调用构造函数,所以malloc出来的空间,你还要在上面赋值才能当成你想要的类型来使用。
从使用方法上,malloc返回的是void*指针,所以你必须进行强制转换才能把分配出来的空间的首地址指针赋给新指针,例如char *p = (char *)malloc( sizeof(char) * 5); 而new就不需要了,直接A *p = new A(type); 其中的type是构造函数的输入参数,可以随意选择一个构造函数,若无可以省略。同时,malloc的输入参数必须是字节数,例子中用到了sizeof。
所以malloc和new就体现了文章开头提到的分配空间和初始化的问题。
分配器介绍:
在C++中,有一个类:allocator类,是C++的一个模板,它提供类型化的内存分配以及对象的分配和撤销。allocator类将对象分配和对象构造分开。这里的对象分配和对象构造当然也是上文提到的分配和初始化啦。
allocator<T> a;
所以,allocator有两个相应的操作,a.allocate(n):分配n个T对象的空间;a.construct(p, t):在T* p指针所指的内存空间,运行复制构造函数用t对p指向对象其进行初始化。当然,析构a.destroy(p)和释放内存a.deallocate(p, n)则是相反的操作,deallocate是释放p开头的n个T对象的空间。
new和operator new:
new是表达式,而operator new则是函数。
operator new是C++中另外一种原始内存的分配方法,用它可以分配未类型化的空间,new运算符和malloc基本是等同的;但C++允许你通过重载的方式自行扩展,使得new运算符背后完成的工作任意复杂——只要最后它能给出合适大小、可读写的内存就行。
new的操作相当于调用operator new分配空间 + construct + 返回对象指针。