以C++为单位的动态分配内存的初始值
Initial Value of Dynamically-Allocated Memory in C++
在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,其他是垃圾,而另一些则是其他东西。或者编译器可以在malloc
或new
后自动插入不可见的memset
。但无论如何,关键是,永远不要依赖价值。例如,即使您的编译器当前版本变为 0,也可能在未来版本中发生变化,并且在另一个编译器上可能不会如此。
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它