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类型的数组,在两种情况下均进行零初始化.
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 [],这也很简单.
不.甚至不要想到做类似的事情:
YourClass *var = new YourClass;
memset(var, 0, sizeof(YourClass));
Run Code Online (Sandbox Code Playgroud)
你最终可能会破坏你的VTABLE(如果你的班级有一个).
我建议使用构造函数来清除类的内部存储器(变量).