在C ++中有malloc
和free
时,new
和delete
有什么用?我想free
和delete
的功能都是一样的。
答案 0 :(得分:8)
他们不一样。 new
调用构造函数,malloc
只分配内存。
此外,它是未定义的行为混合两者(即new
与free
和malloc
与delete
一起使用。)
在C ++中,您应该使用new
和delete
,malloc
和free
是出于与C的兼容性原因。
答案 1 :(得分:5)
在C ++中,使用malloc
& free
代替new
& delete
。
我能想到的一个场景是:
如果您不希望通过隐式构造函数调用来初始化内存,并且只需要为 placement new 确保内存分配,那么使用malloc
就可以了。和free
代替new
和delete
。
另一方面,重要的是要知道 malloc
和new
不一样!
直接的两个重要区别是:
new
保证您的类的构造函数的callng用于初始化类成员,而malloc
则不会,一个人必须在发布一个额外的memset
或相关的函数调用malloc
初始化已分配的内存以执行有意义的操作。
一个很大的优势是,对于new
,您不需要在每次分配后检查NULL
,只需附上异常处理程序就能完成这项工作,从而节省冗余错误检查,而不像{{1 }}
答案 2 :(得分:3)
首先,当你谈到new
和delete
时,我认为你的意思是。{
表达式,而不是operator new
和operator delete
函数。
new
和delete
表达式与malloc
和free
无关
new
,只是顺便管理内存;他们的主要作用是
管理对象生存期:operator new
表达式将调用delete
函数获取内存,然后调用构造函数;一个operator delete
表达式将在调用std::vector
之前调用析构函数
释放记忆。在大多数情况下,对象应该创建,和
不仅仅是已分配,这意味着只使用表达式。
在某些罕见的情况下,人们想要分配和分配
初始化(创建);实现像operator
new
这样的东西是一个
经典的例子,你可以一次为多个对象分配,但是
只能一次构建一个。在这种情况下,您将使用p->~T()
函数进行分配,并将placement new用于初始化;在
另一端,你将显式调用构造函数(类似于
operator delete
)用于销毁,并使用malloc
函数
释放记忆。
副手,我只能想到你使用free
和{。}}的两种情况
C ++中的::operator new
。首先是实现自己的替换
::operator delete
和::operator new
函数。 (我经常更换
调试的全局::operator delete
和malloc
版本,跟踪分配,围绕分配的保护区
内存等)另一种是与传统库交互时
用C语言编写:如果库说要传递指向已分配内存的指针
按free
(因为它会使用malloc
)释放它自己,或者更多
通常,返回指向由malloc
分配的内存的指针
您需要免费,然后必须使用free
和new
。 (该
更好的图书馆将提供自己的分配和解除分配
函数,它们或多或少地与delete
和strdup()
运算符有关
做,但总会有像{{1}}这样的东西。)