以C++为单位的动态分配内存的初始值

Initial Value of Dynamically-Allocated Memory in C++

本文关键字:内存 动态分配 C++ 为单位      更新时间:2023-10-16

在C++中,当您动态分配int数组时,int的值是未定义还是初始化为0?

    int *array = new int[50];

该术语未初始化。但这取决于您如何初始化数组。您可以对其进行值初始化

int *array = new int[50]();

值将为 0。

如果将其保留为未初始化状态,则无法知道其中有哪些值,因为从中读取将是未定义的行为。

如果使用向量而不是数组,则将获得所有元素的初始值 0:

std::vector<int> v(50);

如果需要不同的默认值,可以指定一个:

std::vector<int> v(50, 42);

向量的另一个好处是,您不必手动释放底层数组。

回答你的问题没有。但是有一种方法可以设置默认值。尝试:

int *arr = new int[SIZE]() ;

以上是C++标准,但可能不适用于所有编译器。安全的选择是使用循环并将其初始化为您选择的默认值。

for(int i=0; i < SIZE; i++)
{
  arr[i] = 1; //1 being my default value
}

编辑:正如其他人更好地指出的那样:memset

它们将是未定义的。只是垃圾,这取决于在初始化之前这些位置中的内容

如果你写

int *array = new int[50];

那么数组中的值可以包含任何内容,但是如果您编写

int *array = new int[50]();

然后您将调用"默认构造函数",并且所有内容都将为 0。

它们是 neighter,它们包含分配之前存在的任何数据。

在 C/C++ 中,在内存中分配一个对象意味着简单地为该对象保留一些内存块。初始值基本上是这些块中存在的值,大多数时候是随机值。

你需要假设它是垃圾,即使它可能经常(特别是在调试版本中)被初始化为零或其他一些预定义值,指示未初始化的内存(如果不使用零,通常是一些HexSpeak值)。

例如,请参阅 http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

它完全没有被标准定义,实际上只取决于你的操作系统和编译器。在某些编译器中,它只使用操作系统给你的任何内容,而在某些操作系统中,它将是0,其他是垃圾,而另一些则是其他东西。或者编译器可以在mallocnew后自动插入不可见的memset。但无论如何,关键是,永远不要依赖价值。例如,即使您的编译器当前版本变为 0,也可能在未来版本中发生变化,并且在另一个编译器上可能不会如此。