我使用calloc
,我已经读过,calloc
内部调用new
处理程序,那么我该怎么办?
我应该使用new
运算符(快速分配)还是calloc
(也可以分配和初始化内存)?
答案 0 :(得分:2)
这个问题无法真正回答,因为它基于错误的假设,new
只是分配内存但不初始化它。相反的是:
new
不仅分配内存(除非你使用“placement new”),它还调用一些对象构造函数。即new
的作用远不止calloc
。
在C ++中,如果您觉得需要为例如分配一些内存一些可变大小的数组,首先考虑使用标准容器,例如喜欢
std::vector<char> buf( 1024 );
在
char *buf = new char[1024];
答案 1 :(得分:1)
calloc
与new
无法真正比较;它更接近operator new
(它们不一样)。 calloc
会将分配的内存清零,而operator new
和malloc
则不会。 new
在存储位置构建对象,但calloc
没有。
// Using calloc:
my_object* p = static_cast<my_object*>(std::calloc(1, sizeof(my_object)));
::new(static_cast<void*>(p)) my_object(10);
// Using operator new:
my_object* p = static_cast<my_object*>(::operator new(sizeof(my_object)));
::new(static_cast<void*>(p)) my_object(10);
// using new:
my_object* p = new my_object(10);
答案 2 :(得分:1)
好吧,每个人都告诉过你new
没有初始化内存等,但他们忘记了值初始化语法:
char *buffer = new char[size]();
所以我认为你总是使用new
。如果要初始化内存,请使用上面的语法。否则,请删除括号。
答案 3 :(得分:0)
我应该使用new运算符(快速分配)还是calloc(也可以分配和初始化内存)?
在C ++中,你永远不应该使用* alloc memory函数(malloc
,calloc
,free
等)。它们会导致您创建对C ++不安全的代码(对于C来说没问题)。
您还应该使用最专业(更高级别)的代码构造。
这意味着:
new
/ new[]
/ delete
/ delete[]
而不是malloc
/ calloc
/ free
std::vector
/ std::array
/ etc而不是new[]
和delete[]
,使用std::unique_ptr<T>
/ {{1}而不是std::shared_ptr<T>
等等。