2012-10-04 74 views
0

下面是一個簡單的VC++程序的片段,它正在Visual Studio 10上運行,並帶有線程構建模塊(開源4.1)支持。新分配的堆內存(VS2010)的初始內容

我從例子中編譯並運行了一個程序,並且很驚訝地看到來自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,* POS:3452816845

令我驚訝的是max和在兩種情況下POS相同的值。

這可能是由於庫中新操作符的重載造成的?

這是一個需要報告的錯誤嗎?

這只是巧合嗎?

+0

可能我認爲這是一個錯誤是不正確的 –

+0

你認爲你的想法是錯誤的錯誤是正確的。這是MSVC運行時堆分配器的調試版本的默認行爲 - 它用'0xCD'填充新分配的堆內存,在內部稱爲_bCleanLandFill - 見[here](http://zeroflag.wordpress。 COM/2007/05/03 /魔法值-ON-THE-MSVCRT調試堆/)。順便說一句,你顯示的代碼片段根本不使用TBB,所以你的問題的標題是誤導性的。 –

+0

既然你明確知道你正在打印未初始化內存的內容,我不明白你的問題。你是否期望一些特殊的價值? – jthill

回答

0

堆中新分配的空間的內容未定義,因爲它不會由標準類型的運算符new初始化。 值轉換爲十六進制0xCDCDCDCD,我猜想出於某種原因,完整的堆區域填充此模式。

更多的細節:

  • 您在堆上分配size_t類型的兩個數組。因爲size_t是一個用於unsigned int的 typedef,所以opreator new將只在堆上分配空間(如malloc會),但不會以任何方式調用任何構造函數或初始化內存。
  • 將分配的數組分配給size_t類型的指針,然後指向 到數組的第一個元素。
  • cout語句正在打印指針指向的內存內容(因爲指針被解除引用),其中包含之前存儲的內容。