新分配的堆内存的初始内容 (VS2010)

Initial content of newly allocated heap memory (VS2010)

本文关键字:VS2010 分配 新分配 内存      更新时间:2023-10-16

下面是一个简单的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 语句正在打印指针指向的内存内容(因为指针被取消引用),其中包含以前存储在那里的任何内容。