新分配的堆内存的初始内容 (VS2010)
Initial content of newly allocated heap memory (VS2010)
下面是一个简单的VC++程序的片段,该程序在Visual Studio 10上运行,支持Thread Building Blocks(开源4.1)。
我从示例中编译并运行了一个程序,并惊讶地看到 cout 中新运算符的输出。
int main() {
string str[N] = { string("a"), string("b") };
for (size_t i = 2; i < N; ++i) str[i] = str[i-1]+str[i-2];
string &to_scan = str[N-1];
size_t num_elem = to_scan.size();
size_t *max = new size_t[num_elem];
size_t *pos = new size_t[num_elem];
cout <<"*max : " << *max<< ", "<<"*pos :"<<*pos<<endl;
......
......
cout 输出如下所示:
*最大值 : 3452816845, *位置 : 3452816845
令我惊讶的是,在这两种情况下,max 和 pos 的值相同。
这可能是由于库中新运算符的一些重载吗?
或
这是一个要报告的错误吗?
或
这只是巧合吗?
堆上新分配的空间的内容是未定义的,因为它不会被标准类型的运算符 new 初始化。该值转换为十六进制的0xCDCDCDCD,我想由于某种原因,整个堆区域都充满了这种模式。
更多细节:
- 在堆上分配两个类型为 size_t 的数组。由于size_t是一个typedef 对于无符号的 int,opreator new 只会在堆上分配空间(就像 malloc 一样),但不会调用任何构造函数或以任何方式初始化内存。
- 分配的数组被分配给类型为 size_t 的指针,然后指针将指向到数组的第一个元素。
- cout 语句正在打印指针指向的内存内容(因为指针被取消引用),其中包含以前存储在那里的任何内容。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 新分配的堆内存的初始内容 (VS2010)
- 在VS2010中使用发布配置构建时未分配处理的值