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

Posted

技术标签:

【中文标题】新分配堆内存的初始内容(VS2010)【英文标题】:Initial content of newly allocated heap memory (VS2010) 【发布时间】:2012-10-04 19:18:29 【问题描述】:

下面是一个简单的 VC++ 程序的 sn-p,它在 Visual Studio 10 上运行,支持线程构建块(开源 4.1)。

我从示例中编译并运行了一个程序,并且惊讶地看到来自 cout 的 new 运算符的输出。

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 的值相同。

这可能是由于库中 new 运算符的一些重载吗?

这是要报告的错误吗?

这只是巧合吗?

【问题讨论】:

可能我认为这是一个错误的想法是不正确的 您认为这是一个错误的想法是不正确的。这是 MSVC 运行时中堆分配器调试版本的默认行为 - 它使用 0xCD 填充新分配的堆内存,内部称为 _bCleanLandFill - 请参阅 here。顺便说一句,您显示的代码片段根本不使用 TBB,因此您的问题标题具有误导性。 既然你清楚地知道你正在打印未初始化内存的内容,我不明白你的问题。您是否期望某些特定的价值? nobugs.org/developer/win32/debug_crt_heap.html 不!在这两种情况下,我都对相同的值感到惊讶,并且我认为某些库中的 TBB 出于某种我不知道的目的而重载了 new 运算符。感谢您的宝贵时间。 【参考方案1】:

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

更多细节:

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

【讨论】:

以上是关于新分配堆内存的初始内容(VS2010)的主要内容,如果未能解决你的问题,请参考以下文章

jvm 堆内存及非堆内存配置

动态内存分配

java类中成员变量初始化后存放在堆内存中还是栈内存中?

tomcat 性能优化中参数xms是啥意思

JVM-内存分配与垃圾回收

tomcat 设置内存