当我们有新的/删除时,为什么要使用malloc / free?

时间:2012-04-02 07:12:25

标签: c++ memory-management

在C ++中有mallocfree时,newdelete有什么用?我想freedelete的功能都是一样的。

3 个答案:

答案 0 :(得分:8)

他们不一样。 new调用构造函数,malloc只分配内存。

此外,它是未定义的行为混合两者(即newfreemallocdelete一起使用。)

在C ++中,您应该使用newdeletemallocfree是出于与C的兼容性原因。

答案 1 :(得分:5)

在C ++中,使用malloc& free代替new& delete

我能想到的一个场景是:

如果您不希望通过隐式构造函数调用来初始化内存,并且只需要为 placement new 确保内存分配,那么使用malloc就可以了。和free代替newdelete

另一方面,重要的是要知道 mallocnew不一样!
直接的两个重要区别是:

  • new保证您的类的构造函数的callng用于初始化类成员,而malloc则不会,一个人必须在发布一个额外的memset或相关的函数调用malloc初始化已分配的内存以执行有意义的操作。

  • 一个很大的优势是,对于new,您不需要在每次分配后检查NULL,只需附上异常处理程序就能完成这项工作,从而节省冗余错误检查,而不像{{1 }}

答案 2 :(得分:3)

首先,当你谈到newdelete时,我认为你的意思是。{ 表达式,而不是operator newoperator delete函数。 newdelete表达式与mallocfree无关 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 deletemalloc 版本,跟踪分配,围绕分配的保护区 内存等)另一种是与传统库交互时 用C语言编写:如果库说要传递指向已分配内存的指针 按free(因为它会使用malloc)释放它自己,或者更多 通常,返回指向由malloc分配的内存的指针 您需要免费,然后必须使用freenew。 (该 更好的图书馆将提供自己的分配和解除分配 函数,它们或多或少地与deletestrdup()运算符有关 做,但总会有像{{1}}这样的东西。)