"new
"、"malloc
"和"calloc
"等函数有何区别?
除了"new
"以外,什么时候需要用到其他函数?
它们之间是否有互相实现的情况?
"new
"、"malloc
"和"calloc
"等函数有何区别?
除了"new
"以外,什么时候需要用到其他函数?
它们之间是否有互相实现的情况?
new
和delete
是C++语言特有的功能,在C语言中不存在。使用malloc
是C语言中传统的方式,但在大多数情况下,在C++中不需要使用malloc
。
malloc
分配未初始化的内存,必须使用free
释放所分配的内存。calloc
与malloc
类似,但会将分配的内存初始化为常量(0)。需要使用free
释放。new
通过调用构造函数来初始化分配的内存(如果是对象)。使用new
分配的内存应该使用delete
释放(它会调用析构函数)。使用new
时不需要手动指定所需大小并将其强制转换为适当的类型。因此,更加现代化且不易出错。new
/delete
+ new[]
/delete[]
:
new
/delete
是C++中从堆上分配和释放内存的方式。new[]
/delete[]
是C++中分配连续内存数组的方式。malloc
更加类型安全。realloc
那样使用,但可以使用placement new来重用相同的数据缓冲区。new
分配内存然后使用free
或者delete[]
进行释放。malloc
/free
+ family:
malloc
/free
/family 是C语言中从堆上分配和释放内存的方式。calloc
和malloc
相同,但也会初始化内存。malloc
分配内存然后使用delete
或者delete[]
进行释放。另请参阅我的相关回答
new
分配内存并调用构造函数(顺序未指定),delete
调用析构函数并释放由new
分配的内存。malloc
仅分配一些内存,free
删除由malloc
分配的内存。new
可以使用malloc
实现(虽然标准不要求)。calloc
与malloc
执行相同的操作,并且还将新分配的内存初始化为零。正如其他帖子所指出的:malloc
/free
是C++的一部分,以保持与C的兼容性。
你只需要new,不需要其他。在C++中,它完全替代了malloc。
至于区别:malloc只分配内存。new分配内存并调用构造函数。同样,free只释放内存。delete释放内存并调用析构函数。
警告一句话:不要混合使用这两种习惯用法。结果是未定义的。
使用new意味着将在新分配的内存上调用构造函数。如果被分配的对象没有构造函数,那么new在功能上与malloc相同,通常应该优先使用new。
new可能是基于malloc实现的,也可能不是 - C++标准并不要求任何一种方法。
我能记起的new和malloc之间的主要区别是,你不能使用realloc重新分配由new分配的内存。因此,如果你想增加/减少内存块的大小,你必须分配一个新的块并将所有内容复制过去。
calloc允许你初始化你分配的内存块,而malloc不行。