C ++中动态分配内存的初始值

时间:2012-09-23 14:32:18

标签: c++ memory dynamic

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

    int *array = new int[50];

9 个答案:

答案 0 :(得分:7)

这个词是未初始化。但这取决于你如何初始化数组。您可以对其进行初始化

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

,值为0。

如果你没有初始化它,你就无法知道它们的值是什么,因为从中读取它们将是未定义的行为。

答案 1 :(得分:6)

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

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

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

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

向量的另一个好处是您不必手动释放基础数组。

答案 2 :(得分:3)

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

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

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

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

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

答案 3 :(得分:2)

他们将是未定义的。在初始化之前,只需要根据这些位置的内容进行垃圾处理

答案 4 :(得分:1)

如果你写

int *array = new int[50];

然后数组中的值可以包含任何内容,但是如果你写了

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

然后你将调用“默认构造函数”,一切都将为0。

答案 5 :(得分:0)

它们更新,它们包含分配前的任何数据。

答案 6 :(得分:0)

在C / C ++中,在内存中分配对象意味着只需为该对象保留大量内存块。 初始值基本上是那些块中存在的大部分时间随机值。

答案 7 :(得分:0)

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

E.g。见http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

答案 8 :(得分:0)

标准完全没有定义,实际上只取决于您的操作系统和编译器。在一些编译器中,它只使用操作系统给你的任何东西,在一些操作系统中将为0,其他操作系统为垃圾,其他操作系统为其他操作系统。或者编译器可以在memsetmalloc之后自动插入不可见的new。但无论如何,重点是,永远不要依赖价值。即使你的编译器的当前版本使其为0,比如说,在将来的版本中可能会改变,而在另一个编译器中可能不会这样。