是否可以将一个新分配的块初始化为0
Is it possible to initialize a new allocated block to 0?
我已经读过一些方法,比如对已知数量的值这样做:
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_ptr
或std::shared_ptr
而不是原始指针的原因相同!
我不会使用new operator
和使用c++ STL容器,如std::vector
或std::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
。
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 为什么通过指针编译时不能分配 const 初始化
- C++ 手动分配和初始化对象
- 静态分配对象的值初始化
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 分配给已删除/未初始化的对象
- C++初始化列表与分配值
- 动态分配的对象未初始化
- 可视化C++将分配移动到未初始化的对象?
- 如何修复初始化后'stack around variable was corrupted.'变量未更改为分配的值
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 在 C++ 中初始化后的数组分配
- 将已初始化的基类分配给派生类
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 当您通过分配初始化C 对象时会发生什么
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 将空初始化器列表分配给现有向量或地图的效果
- 正在分配初始化的、对齐的内存
- 在函数参数中分配/初始化引用
- c++类中的动态内存分配初始化