C++:表现得像calloc的新调用?

niv*_*nad 37 c++ new-operator calloc

是否有一个电话,我可以让它将new内存归零calloc

Joh*_*itb 73

与他们的答案中的一些人所说的相反,这可能的.

char * c = new char[N]();
Run Code Online (Sandbox Code Playgroud)

零将初始化所有字符(实际上,它被称为值初始化.但是值初始化将是标量类型数组的所有成员的零初始化).如果这就是你所追求的.

值得注意的是,它也适用于没有用户声明的构造函数的(类)类的类型,在这种情况下,它们的任何成员都是值初始化的:

struct T { int a; };
T *t = new T[1]();
assert(t[0].a == 0);
delete[] t;
Run Code Online (Sandbox Code Playgroud)

这不是某种延伸或其他什么.它在C++ 98中的工作和行为也是一样的.就在那里它被称为默认初始化而不是值初始化.但是,对于标量或标量或POD类型的数组,在两种情况下均进行零初始化.

  • 更不用说VC6实际上略早于C++ 98标准:-) (3认同)

Jar*_*Par 11

不,但创建一个像calloc一样的新版本相当容易.它的实现方式与实现no-throw版本的新方法完全相同.

SomeFile.h

struct zeromemory_t{};
extern const zeromemory_t zeromemory;
void* __cdcel operator new(size_t cbSize, const zeromemory_t&);
Run Code Online (Sandbox Code Playgroud)

SomeFile.cpp

const zeromemory_t zeromemory;

void* _cdecl operator new(size_t cbSize, const zeromemory_t&)
{
    void *mem = ::operator new(cbSize);
    memset(mem,0,cbSize);
    return mem;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以执行以下操作以获得零内存的新功能

MyType* pMyType = new (zeromemory) MyType();
Run Code Online (Sandbox Code Playgroud)

此外,你还需要做其他有趣的事情,比如定义new [],这也很简单.

  • 只是要指出这个正式名称是新的位置.如果丹文想要更多关于这个问题的信息.也可以用于创建对象缓存(想想linux内核slab缓存) (2认同)
  • s/opeartor/operator /;)可能想要作为警告,确保在一个编译单元中实例化`const zeromemory_t zeromemory;`. (2认同)

Pab*_*ruz 5

不.甚至不要想到做类似的事情:

YourClass *var = new YourClass;
memset(var, 0, sizeof(YourClass));
Run Code Online (Sandbox Code Playgroud)

你最终可能会破坏你的VTABLE(如果你的班级有一个).

我建议使用构造函数来清除类的内部存储器(变量).

  • 我不知道; 如果他真的想要在脚下射击自己,那么阻止他是合乎道德的吗?:-) (3认同)