C ++中的“new”和“malloc”和“calloc”有什么区别?
“新”,“malloc”和“calloc”等家族的区别是什么?
(什么时候)需要“新”以外的东西吗?
其中一个使用其他吗?
new
和delete
是C ++特有的function。 他们在C中不存在malloc
是老派C做事的方式。 大多数情况下,你不需要在C ++中使用它。
-
malloc
分配未初始化的内存。 分配的内存必须free
发布。 -
calloc
就像malloc
但用一个常量(0)初始化分配的内存。 它需要free
。 -
new
通过调用构造函数初始化分配的内存(如果它是一个对象)。 分配new
内存应该释放与delete
(这又调用析构函数)。 它不需要您手动指定所需的大小并将其转换为适当的types。 因此,它更现代化,不容易出错。
新build/删除+新build[] /删除[]:
- new / delete是从堆中分配内存和释放内存的C ++方式。
- new []和delete []是分配连续内存数组的c ++方法。
- 应该使用,因为它比malloc更安全
- 应该使用,因为它调用构造函数/析构函数
- 不能以重新分配的方式使用,但可以使用新的位置来重新使用相同的数据缓冲区
- 数据不能用new和free分配,也不能delete []
malloc / free +系列:
- malloc / free / family是从堆中分配和释放内存的C方式。
- calloc和malloc一样,但是也初始化了内存
- 如果您可能需要重新分配内存应该使用
- 数据不能用malloc分配,用delete或delete []释放
另请参阅我的相关答案
- 新分配和呼叫ctor(订单未指定),删除dtor并将呼叫分配的内存释放到新的
- malloc只分配一些内存,免费删除由malloc分配的内存
- 新的可以用malloc来实现(虽然不是标准要求)
- calloc与malloc做同样的事情,也将新分配的内存归零
正如其他文章指出的:malloc / free是C ++的一部分,与C兼容。
另请参阅: Stroustrup:new vs malloc
使用新的意味着将在新分配的内存上调用构造函数。 如果被分配的东西没有构造函数,new在function上和malloc是一样的。 通常应该引用它。
新的可能或不可能用malloc来实现 – C ++标准不需要任何一种方法。
除了新的,你不需要任何东西。 它是C ++中malloc的完全替代品。
至于区别:Malloc只是分配内存。 新分配的内存并调用构造函数。 同样,免费只是释放内存。 删除释放内存并调用析构函数。
警告一句:不要混用这两个成语。 结果是不确定的。
新的和malloc之间的主要区别我可以回想起来的是,你不能用realloc重新分配新分配的内存。 所以,如果你想增加/减less内存块的大小,你必须分配一个新的块,并复制一切。
Calloc允许你初始化你分配的内存块,而malloc不会。
当你新build一个对象时,对象的空间不仅被分配,而且对象的构造函数被调用。 但是这是C ++方式完成的, malloc是分配内存C中的旧版本方式。 calloc和malloc是一样的,除了清除内存到所有零位。