如何归零动态数组?

时间:2014-09-09 12:54:00

标签: c++ dynamic-arrays

请注意,我正在学习Visual C ++。

据我所知,我们应该以这种方式将动态数组归零:

void main()
{
    int *arr = new int[15];
    memset(arr,0,15*sizeof(*arr));
    ...
    delete [] arr;
}

但我找到了另一种方法:

void main()
{
    int *a = new int[15]();
    ...
    delete [] arr;
}

如您所见,我在括号后添加了两个括号。但它只有在我设置数组的大小时才有效。

我找不到任何关于此的信息,我不知道这需要什么目的。

编辑:第一个代码现在由VC编译器编辑和验证。 EDIT2:所以我在MSDN上找不到关于第二代码的手册。在那里我可以找到这个? (没有谷歌PLZ)

2 个答案:

答案 0 :(得分:8)

确实,添加括号指定值初始化,将int等简单类型设置为零。

第一个片段(或者在编辑问题之前)是错误的,原因有两个:

  • 您没有在new-expression中指定数组的大小,例如new int[15]
  • 您只将第一个元素设置为零。乘以数组的大小,或者做一些不太容易出错的事情。

一般情况下,不要乱用低级内存分配;使用友好的类型,为您记忆:

#include <vector>

int main() {                    // 'void' is also wrong here
    std::vector<int> arr(15);   // dynamic array of 15 'int' values, zero-initialised
    // no need to delete anything
}

答案 1 :(得分:0)

  

我找不到任何关于此的信息,我不知道这需要什么目的。

这是初始化代码,在语言中引入(如果我没记错的话),允许在编写模板和类时将本机类型视为泛型类型。

以下是一个例子:

struct S { int x; S(int a) : x(a) {} }; // structure with constructor taking an int
                                        // observe constructor syntax for int member

// example factory function (not very usefull in practice but good example)
template<typename T>
T make_instance( int x ) { return T(x); /* use old syntax for constructor call */ }

auto s = make_instance<S>(10); // create S instance with value 10
auto i = make_instance<int>(10); // create integer with value 10

在此示例中,模板构造任何类型的实例,该实例支持采用int的构造函数。第二个示例(初始化int)仅在语言支持使用以下语法初始化整数时才有效:

int x(10);

这是构造函数语法。该语言还支持为本机值调用“默认构造函数”(即调用不带参数的构造函数,对于int,将值设置为零)。在您的示例中就是这种情况(调用default implicit int“constructor”)。