是否可以将一个新分配的块初始化为0

Is it possible to initialize a new allocated block to 0?

本文关键字:分配 初始化 一个 是否 新分配      更新时间:2023-10-16

我已经读过一些方法,比如对已知数量的值这样做:

new int[3] {0 , 0, 0};

之后,我想起了C中声明数组初始化的方法我问我自己,在C++中这样做也是有效的:

new int[n] {}

其中空大括号导致所有内容都被0初始化。在我尝试之后,它看起来很好,但也可能只是由随机性和真实的UB或其他东西引起的。

如果它是有效的,是否也有方法初始化一个特定的值?

注意:

我想实现与调用calloc (n, sizeof(int));相同的功能。但是由于我现在在C++而不是C,我将不再使用这些函数来保持代码的可读性。

注2:

当说

我想达到[…]

这是对应于我的最小的例子,我只是想获得一个零初始化的有效内存块

auto array = new int[n] ();

这执行零初始化,因为int是一个"非类类型"。

auto array = new int[n];

这并不。初始值不确定。但请注意,这背后的背景非常令人困惑,标准中的描述更改了几次,可能是为了使其不那么令人困惑,我认为未能达到其效果。因此,一些相关链接:

  • http://en.cppreference.com/w/cpp/language/zero_initialization
  • 下面的短语在c++中是什么意思:零初始化,默认初始化和值初始化?
  • c++ 11中默认初始化改变的含义?

(也请阅读评论)

[…我只需要一个零初始化的内存块,而不是任何向量或数组实现…

std::vector 一个简单的内存块。使用它。它提供的其他成员函数不需要任何成本,除非您使用它们。如果您不需要它,则不会进行任何大小调整。使用它的原因与您应该尽可能选择std::unique_ptrstd::shared_ptr而不是原始指针的原因相同!

我不会使用new operator和使用c++ STL容器,如std::vectorstd::array。这里有一个小示例,因为您知道编译时的大小:

std::array<int,3> foo{}; // will initialize a std::array with 0 value.

关于初始化的更多解释:

new int[5] ()是零初始化,它是有效的,初始化元素为0。

2)作为非类类型的值初始化序列的一部分没有构造函数的值初始化类类型的成员。

new int[5]是默认的初始化,你不能保证它,因为值是任意填充的。

如果T是数组类型,则数组的每个元素都默认初始化。

简单地写new int[n]只是分配内存和初始化什么,所以给定的字节仍然有来自过去未知的另一个使用的值。

通过添加括号,c++添加了一个结构,并用0填充空字段。

您可以使用std::vector

std::vector<int> x(5);

这里的主要优点是std::vector实际上是安全的,不像new