4
int* array = new int[ 10 ]( );

这是新运算符的正确用法吗?据我所知,前面的代码会将数组中的每个元素初始化为 0。

int* array = new int[ 10 ];

第二行代码是否只是初始化数组,而不是将值设置为零?

4

1 回答 1

2

使用 new 运算符的正确方法取决于分配内存后接下来要做什么。

int* array = new int[10](); 会将您分配的内存清零,因为它正在为数组中的每个 int 运行 int 初始化程序。

int* array = new int[10]; 不会初始化内存,因此数组中每个 int 的值将是您从中获得的内存地址处的值new。如果幸运的话,它可能是零,但很可能是其他一些内存请求/释放留下的垃圾。

一般来说,您需要将未初始化的变量视为垃圾值,并且在为它们赋值之前不要使用它们。那是除非您将它用作随机数生成器中的熵,但即便如此,如果内存恰好太干净,它也可能不够随机。另一个罕见的用例可能是窥探另一个程序在关闭后留在内存中的内容。这两个例子都是规则的例外。

通常不初始化的最好理由是速度。将数组中的每一项设置为 0 都会降低速度,虽然它可能很小,但如果您的数组很大或者您经常执行此代码,它可能会很明显。这是因为当您知道将在使用它们之前设置这些值时,您可以节省不必要的初始化它们的成本。

现在说了这么多,我也同意std::vector<int>通常是更好的方法的评论,如果只是为了你不必担心内存泄漏的优势(这可能会花费大量的调试/开发时间并且不应被低估)并且您还可以获得很多好处。更不用说你可以用向量做所有与普通数组一样的事情——这是因为向量分配了连续的内存。

std::vector<int> safeArray(10);
int* array = &safeArray[0]; // array now points to the 0th element in safeArray

std::vector 失去的一件事是您不再可以选择是否初始化。

于 2014-01-30T08:15:49.437 回答