新的_Elem [_Size]()与新的_Elem [_Size] {}有什么区别?

时间:2019-04-11 09:29:21

标签: c++ c++17

new _Elem[_Size]()new _Elem[_Size]{}之间有什么区别,我应该选择哪种形式?

如果您知道有问题的元素并且未在模板参数上使用它,是否会有所不同?

这个问题假设需要一个原始指针-通常您应该只使用std::vectorstd::unique_ptr

2 个答案:

答案 0 :(得分:2)

两者之间没有区别。

除了{}在C ++ 98中不起作用。

答案 1 :(得分:2)

在C ++中,{}用于向对象提供初始化值,并且自C ++ 03起实现。

以下是有关价值初始化的一些有用信息:
https://en.cppreference.com/w/cpp/language/value_initialization
以及一个论坛帖子,询问了一个非常相似的问题,并得到了名为Alok Save的用户的良好回答:
What does 'value initializing' something mean?

您应该使用哪个对象取决于对象的处理方式以及对象的构造函数是否接受值初始化。在C ++ 03之后,如果正在创建对象数组,并且将数据放入{}中,并且对象的构造函数接受值初始化,则数组的每个元素都将被值初始化,但是如果您只放置{},则该数组如果支持,将被零初始化。
例如,以下是初始化整数数组的各种方法:

值初始化列表,请执行以下操作:
int* intArray = new int[5]{1, 2, 3, 4, 5};
列表将被初始化为:
1, 2, 3, 4, 5

但是,如果您尝试像这样初始化列表:
int* intArray = new int[5]{1};
您最终将得到:
1, 0, 0, 0, 0
这是因为对于整数数组,每个元素都需要一个初始化值。

还要注意,通过使用默认构造函数,列表根本不会初始化(无论如何对于整数列表),因此:
int* intArray = new int[5];
将导致每个元素保留该内存位置上已经存在的任何值,例如:
16256696, 16253120, 0, 0, -1543503708
如果您计划要做的第一件事是用程序中的数据填充数组,则这将更快,更高效,因为您不必在每个内存位置中都设置两次数据。但是,正如评论中指出的那样,这最终意味着数组中的数据不可预测,因此您需要确保尽快填充整个数组以防止潜在的错误。

或者,如果您希望将数据零初始化,则应执行以下操作:
int* intArray = new int[5]{};
并且列表qill初始化为:
0, 0, 0, 0, 0

但是,不能保证_Elem数据类型也是如此,因此,我建议进行一些类似于此处所做的测试,以确定与您最相关的内容。