如何用C ++中的新运算符初始化内存?
我刚刚开始进入C ++,我想要选择一些良好的习惯。 如果我刚刚为new
运算符分配了一个int
类型的数组,我怎样才能将它们全部初始化为0而无需自己循环遍历它们? 我应该只使用memset
吗? 有没有“C ++”的方式来做到这一点?
这是C ++的一个令人惊讶的鲜为人知的特性(就像没有人给出这个答案一样),但它实际上有特殊的语法来默认初始化一个数组(在技术上,它被称为“value-初始化“):
new int[10]();
请注意,您必须使用空括号 - 例如,您不能使用(0)
或任何其他表达式(这就是为什么这仅用于默认初始化)。
这是ISO C ++ 03 5.3.4 [expr.new] / 15明确允许的,它表示:
创建类型为T的对象的新表达式按如下方式初始化该对象:
...
并且不限制允许这种类型的类型,而(expression-list)
形式被同一节中的其他规则明确地限制,使得它不允许数组类型。
假设你真的想要一个数组而不是一个std :: vector,那么“C ++方式”就是这样
#include <algorithm>
int* array = new int[n]; // Assuming "n" is a pre-existing variable
std::fill_n(array, n, 0);
但请注意,在实际情况下,这实际上仍然是一个循环,将每个元素赋值为0(实际上没有其他方法可以执行此操作,除非具有硬件级支持的特殊架构)。
有很多方法来分配一个内部类型的数组,但所有这些方法都是正确的,但哪一个可以选择,取决于...
手动初始化循环中的所有元素
int* p = new int[10];
for (int i = 0; i < 10; i++)
{
p[i] = 0;
}
使用<cstring>
std::memset
函数
int* p = new int[10];
std::memset(p, 0, 10);
使用<algorithm>
std::fill_n
算法
int* p = new int[10];
std::fill_n(p, 10, 0);
使用std::vector
容器
std::vector<int> v(10); // elements zero'ed
如果C ++ 0x可用,则使用初始化器列表功能
int a[] = { 1, 2, 3 }; // 3-element static size array
vector<int> v = { 1, 2, 3 }; // 3-element array but vector is resizeable in runtime
链接地址: http://www.djcxy.com/p/13755.html