從C背景來看,我一直認爲POD類型(例如ints)從來不會在C++中自動初始化,但似乎這顯然是錯誤的!C++ POD類型何時獲得零初始化?
我的理解是,只有'裸'的非靜態POD值不會被零填充,如代碼片段所示。我說得沒錯,還有其他重要的案例我錯過了嗎?
static int a;
struct Foo { int a;};
void test()
{
int b;
Foo f;
int *c = new(int);
std::vector<int> d(1);
// At this point...
// a is zero
// f.a is zero
// *c is zero
// d[0] is zero
// ... BUT ... b is undefined
}
你確定它是C++而不是你的操作系統嗎?我會想象(但沒有檢查過),當一個操作系統爲你的進程分配內存時,至少當你觸及內存頁面時,它會將其歸零。 C和C++都不需要這種行爲,但是如果操作系統用最後一個進程放入其中的任何一個內存頁面,這將是一個很大的安全漏洞。如果ssh是使用該物理內存頁面的最後一個進程,那麼可能存在登錄信息或私鑰。 – 2010-06-23 13:45:27
操作系統在分配內存時要保持內存清零似乎有點浪費。 – Alan 2010-06-23 13:46:41
您可能還會閱讀Michael Burr在回覆[[類型名稱與新的區別之後的括號是否相同]]的優秀相關文章(http://stackoverflow.com/questions/620137/do-the-parentheses-在類型名稱make-a-difference-with-new/620402#620402) – 2010-06-23 13:46:43