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

时间:2012-10-04 19:18:30

标签: c++ multithreading visual-c++

下面是一个简单的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输出如下所示:

* max:3452816845,* pos:3452816845

令我惊讶的是,两种情况下max和pos的值都相同。

这可能是由于库中的一些新操作符超载了吗?

OR

这是一个要报告的错误吗?

OR

这只是巧合吗?

1 个答案:

答案 0 :(得分:0)

堆上新分配的空间的内容是未定义的,因为它不会被标准类型的operator new初始化。 该值转换为十六进制的0xCDCDCDCD,我想完整的堆区域由于某种原因填充了这种模式。

更多细节:

  • 您在堆上分配两个类型为size_t的数组。因为size_t是a 对于unsigned int的typedef,opreator new只会在堆上分配空间(就像malloc那样), 但不会以任何方式调用任何构造函数或初始化内存。
  • 分配的数组被分配给size_t类型的指针,然后指向该指针 到阵列的第一个元素。
  • cout语句打印指针指向的内存内容(因为指针被解除引用),其中包含之前存储的内容。